2016-03-29 20 views
2

Ich habe Probleme, die richtige Syntax für eine select distinct-Anweisung zu erhalten.Wählen Sie eindeutig von Bedingung

Ich kann nicht den richtigen Code herausfinden, um zu bekommen, was ich von diesem Link benötige.

Dies ist der Code, den ich jetzt habe, aber es wählt offensichtlich mehrere Daten, wenn ich die SELECT DISTINCT nur column1 angewendet werden soll.

SELECT DISTINCT 
    column1, column2, column3, column4, column5 
FROM Table1 
WHERE 
    column1 >= '2016/1/1' 
    And column1 < '2016/1/4' 
    AND column2 = 1 
    AND column3 = 1 
ORDER BY column2, column1; 

Dies ist, was ich in Fiddle zusammen, aber auch hier wählt diese mehrere gleichen Daten in column1. Ehrlich gesagt weiß ich nicht einmal, wo ich anfangen soll, diese Aussage aus diesen Links zu konstruieren.

Sorry, verknüpft ich SQL Sever 2008 von Fiddle, ich bin mit 2014

EDIT: Weitere Informationen hinzufügen, Dies ist das Ergebnis bin ich jetzt bekommen:

January, 01 2016 00:00:00 1 1 1 4 
January, 01 2016 00:00:00 1 1 5 4 
January, 01 2016 00:00:00 1 1 9 4 
January, 02 2016 00:00:00 1 1 2 4 
January, 02 2016 00:00:00 1 1 6 4 
January, 03 2016 00:00:00 1 1 3 4 
January, 03 2016 00:00:00 1 1 7 4 

Dies ist Ergebnisse ich suche:

January, 01 2016 00:00:00 1 1 1 4 
January, 02 2016 00:00:00 1 1 2 4 
January, 03 2016 00:00:00 1 1 7 4 
+0

Ich kann deine Geige nicht öffnen. Könnten Sie das in die Frage aufnehmen? –

+1

Willst du so etwas? 'SELECT Spalte1, Spalte2, Spalte3, Spalte4, Spalte5 FROM TABLE1 WHERE Spalte1 IN (SELECT DISTINCT Spalte1 FROM TABLE1 WHERE Spalte1> = '2016/1/1' und Spalte1 <'2016/1/4') UND Spalte2 = 1 UND column3 = 1 ORDER BY column2, column1; ' –

+0

@ S.Karras Das funktioniert nicht für mich, ich bekomme immer noch mehrere gleiche Daten von' column1'. –

Antwort

2

Dies ist ein klassisches top-n-per-group Problem.

Eine mögliche Option ist ROW_NUMBER zu verwenden. Sie müssen entscheiden, welche Zeile für jeden eindeutigen Wert der column1 ausgewählt werden soll, indem Sie ORDER BY in der OVER Klausel angeben.

WITH 
CTE 
AS 
(
    SELECT 
     column1, column2, column3, column4, column5 
     ,ROW_NUMBER() OVER(PARTITION BY column1 ORDER BY ...) AS rn 
    FROM Table1 
    WHERE 
     column1 >= '2016/1/1' 
     And column1 < '2016/1/4' 
     AND column2 = 1 
     AND column3 = 1 
) 
SELECT 
    column1, column2, column3, column4, column5 
FROM CTE 
WHERE rn = 1 
ORDER BY column2, column1; 

Siehe Retrieving n rows per group für einen detaillierten Vergleich mehrerer Methoden.

+0

Was setzen Sie nach dem 'ORDER BY ...'? –

+1

@JapanDave, hängt davon ab, welche Zeile Sie für jede Gruppe auswählen möchten. Wenn Sie zum Beispiel eine Zeile mit dem kleinsten Wert in 'column2' auswählen möchten, dann' ORDER BY column2'. Wenn es Ihnen egal ist, welche Zeile Sie auswählen, können Sie 'ORDER BY (SELECT NULL)' auswählen. –

+0

Sorry, ich habe Sie vielleicht verwirrt, ich möchte alle Daten in 'Spalte1'. Ich denke, ich habe dich etwas vermisst, ich habe nicht bemerkt, dass die Datentypen einen Unterschied machen würden, 'column2' ist eigentlich ein nvarchar und ich versuche alle Daten dazu zu bekommen. Es sollte 'column2 = 'myName'' sein. Um der Frage willen haben Sie es beantwortet, aber meine Erklärung fehlt, es tut mir wirklich leid. –

Verwandte Themen