In SQLite 3 versuche ich herauszufinden, wie Zeilen basierend auf einem Mindestwert ausgewählt werden. Ich denke, dass ich eingeschränkt bin, weil ich nicht genug über die verwandte Terminologie weiß, um Google effektiv zu durchsuchen.
Der Tisch sieht aus wie:
num text num2
---------- ---------- ----------
0 a 1
0 a 2
1 a 3
1 b 4
Ich möchte die Zeilen bekommen, wo num2
ist 1, 2
, und 4
. Ich möchte die Auswahl basierend auf dem Mindestwert von num für jeden eindeutigen Wert der Textspalte vornehmen.
Also, für text = 'a'
, der Mindestwert von num
ist 0
, also möchte ich die Zeilen 1 und 2. Für text = 'b'
, der Mindestwert von num
ist 1
, also möchte ich Zeile 4
.
Mit verschiedenen Kombinationen von Gruppieren nach kann ich entweder Zeilen 1
und / 2
oder Zeilen 1
und erhalten 4
. Ich habe das Gefühl, dass mir eine SQL-Komponente fehlt, die das tut, was ich will, aber ich konnte nicht herausfinden, was es sein könnte.
Was ist der richtige Weg, um diese Art von Abfrage durchzuführen?
Mögliche Lösung
Ich habe einen Weg gefunden, dies zu tun. Ich bin nicht seriös genug, um meine eigene Frage zu beantworten, daher mache ich das Update hier. Ich bin mir nicht sicher, ob es immer richtig ist oder wie die Effizienz ist. Kommentare sind willkommen.
Ich habe eine zusammengesetzte select-Anweisung verwendet, bei der eine Abfrage den Mindestwert von num für jeden eindeutigen Textwert ermittelt:
sqlite> select num, text from t group by text having num = min( num );
num text
---------- ----------
0 a
1 b
Dann habe ich dies mit der vollständigen Tabelle verbunden, um alle Zeilen zu erhalten, die diesen beiden Spalten entsprechen.
sqlite> with u as
( select num, text from t group by text having num = min( num ) )
select t.* from t join u on t.num = u.num and t.text = u.text;
num text num2
---------- ---------- ----------
0 a 1
0 a 2
1 b 4
u
Abfrage in einer temporären Tabelle gespeichert, unabhängig davon, ob es als CTE, Ansicht oder Inline als Unterabfrage geschrieben wurde.Ich neige dazu, solche Dinge mit einer äußeren Selbstverbindung zu tun:
Das heißt im Grunde; Geben Sie mir alle Datensätze, die keinen höheren Wert haben, dh null.
quelle
Wie können Sie die Antwort auf Ihre Frage beim nächsten Mal selbst finden? Meiner Meinung nach geschieht dies durch Zerlegen und Befolgen der Logik. Und das hast du richtig verstanden:
Dies bedeutet:
(Dies sollte Ihrer
having
Abfrage entsprechen. Es könnte interessant sein, sich die Zeilen anzusehen, in denennum
NULL gleich ist. Genauer gesagt: Sehen Sie sich an, welche Auswirkungen Zeilen mit Nullen haben, die Sie möglicherweise zuerst mit a herausfiltern möchten.where num is not null
)Von hier aus können Sie Ihr gewünschtes Ergebnis erzielen, indem Sie:
Oder mit einem Join:
Wenn die Leistung Ihrer Tabellen nicht ausreicht, sollten Sie sich komplexere Anweisungen ansehen.
quelle
Sollte diese Abfrage nicht genau das sein, was Sie brauchen?
quelle
num2
Werte eindeutig sind.