Wählen Sie eine Zeile aus der ersten nicht-null-Werte in einem lichten Tabelle
Anhand der folgenden Tabelle:
A | B | C | ts
--+------+------+------------------
1 | null | null | 2016-06-15 10:00
4 | null | null | 2016-06-15 11:00
4 | 9 | null | 2016-06-15 12:00
5 | 1 | 7 | 2016-06-15 13:00
Wie wähle ich die erste nicht-null-Wert für jede Spalte in ein laufendes Fenster von N Zeilen? "Zunächst", wie definiert durch die Reihenfolge der timestamps in den Spalten ts
. Das Abfragen der genannten Tabelle ergeben würde, in:
A | B | C
--+---+---
1 | 9 | 7
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Fenster-Funktion
first_value()
ermöglicht eine relativ kurze und elegante Lösung:a IS NULL
ausgewertetTRUE
oderFALSE
.FALSE
sortiert vorTRUE
. Diese Art der nicht-null-Werte zuerst kommen. Um vonts
(timestamp-Spalte, wie Sie kommentiert) weiter und du hast es in einem einzigenSELECT
.Wäre dies einfacher, wenn Postgres unterstützt
IGNORE NULLS
. Das Handbuch:Einer der wenigen Auslassungen hinsichtlich SQL-standard in diesem Bereich.
db<>fiddle hier
SQL Fiddle.
ORDER BY a IS NULL
vs.order by a nulls first
?ORDER BY a IS NULL
nur sortiert NULL-Werte Letzte, der rest bleibt unsorted - sortiert werden, durchts
in der nächsten iteration.ORDER BY a NULLS LAST
würde zu viel tun.Definieren Sie einen Auftrag (eine primary key-oder etwas anderes), um die ERSTE nicht-null-Wert. So habe ich
ID
Spalte, um die Zeilen in Ihrer Tabelle.SQLFiddle demo
Können Sie dies mit Fenster-Funktionen. Ich Partitioniert die Folge in 2 Teile und dann diese partition für die
row_number
Fenster-FunktionDann mit einer grundlegenden
case
zu bekommen diejenigen, die dierow_number
als1
und die haben einenot null
Wert in IhnenSQLFIDDLE
Ausgabe:
HINWEIS: ich habe eine
id
Feld, die hilft, zu wissen, welche der Datensätze wurde zuerst eingefügt haben, verwenden wir diese in aufsteigender Reihenfolge in unserem Fenster-FunktionNicht sicher, wenn ich die Frage richtig
wie es scheint, ganz einfach im Grunde.
Versuchen Sie diese Abfrage.
SQL Fiddle: http://sqlfiddle.com/#!11/ac585/8