2016-07-01 5 views
0

Ich habe die unten Datensatz ausgegeben wie weniger als einer Frequenz kommen sollte .. : Ich bin so auf SQL haben nicht viel Ahnung ..die Liste der Wert Trennung von Frequenz Vergleich

im Eingang i habe 3 mal 1, 2 mal 2, 3 mal 3 und 2 mal 4. ausgabe ich will 2 mal 1, 1 mal 2, 2 mal 3 und 1 mal 4 ..

Irgendwelche Vorschläge, wie man diese Ausgabe erreicht !!

enter image description here

+0

was hast du bisher probiert? – Sankar

+0

Sind Sie sicher, dass die Ausgabe doppelte Werte enthalten kann? Wenn ja - wie lautet die Regel? –

+0

im Eingang habe ich 3 mal 1, 2 mal 2, 3 mal 3 und 2 mal 4. Ausgabe ich will 2 mal 1, 1 mal 2, 2 mal 3 und 1 mal 4 .. –

Antwort

1

Dies kann in einer kompakteren Form geschrieben werden, sondern nur für Klarheit:

With Src As (  --< Source table 
    Select * From (Values (1),(2),(3),(1),(1),(2),(3),(3),(4),(4),(5)) V (Id) 
), Numbers As (  --< Auxiliary table with numbers from 1 to maximum row count of Src 
    Select ROW_NUMBER() Over (Order By Id) As N From Src 
), Counted As (  --< Calculate current number of ID occurances 
    Select Id, Count(Id) As Cnt From Src Group By Id 
) 
    Select Id 
    From Counted     --< From distinct list of IDs 
    Inner Join Numbers   --< replicate each row 
    On Numbers.N < Counted.Cnt --< one less time than the Cnt 

Expression die Zeile aus SQL: Repeat a result row multiple times...

jpw Implementierung (Sie fühlen sich frei genommen zu replizieren um es in Ihre eigene Antwort zu kopieren):

With Src As (        --< Source table 
    Select * From (Values (1),(2),(3),(1),(1),(2),(3),(3),(4),(4),(5)) V (Id) 
), Numbered As (       --< Number ID occurances 
    Select Id, row_number() Over (Partition By id Order By id) As n From Src 
) 
    Select Id From Numbered Where n > 1  --< Take one off 
+0

Aktualisiert folgende Erklärung in den Kommentaren zur Frage –

+2

Sie könnten die Daten in der Funktion row_number partitionieren und Zeilen mit der Nummer 1 herausfiltern. Es sollte effizienter sein: So etwas wie 'Zahlen als ( select id, row_number() over (Partition von ID-Reihenfolge nach ID) als n aus src ) ID aus Zahlen mit n <> 1 auswählen. Dies ergibt einen besser aussehenden Ausführungsplan in meinem Test. – jpw

+1

@jpw Gute Idee! Ich würde es definitiv aufwerten. ;-) –