2016-06-08 4 views
0

Ich brauche ein Beispiel-Dataset, im Grunde um die Anzahl der Zeilen zu reduzieren, so dass das Beispiel in ein Excel-Blatt geladen werden kann.Kann SQL verwendet werden, um eine verteilte Stichprobenmenge zurückzugeben?

Ich habe die analytischen Funktionen und diese Ask Tom Beitrag, aber ich bin nicht in der Lage, die Ergebnisse, die ich brauche, im Grunde, weil ich sehe nicht meine Bedürfnisse in der Lage, eine analytische Gruppierung zu verwenden.

Hier ist eine Darstellung der Daten. Jede Zeile ist einzigartig. Cat_No ist der Primärschlüssel.

 
     CAT_NO |PROD_CODE |DESCRIPTION |COLOR | 
     SH1 |SH   |Shirt  |Blue | 
     SH2 |SH   |Shirt  |Red | 
     BT1 |BT   |Belt  |Black | 
     BT4 |BT   |Belt  |Brown | 
     WT1 |WT   |Watch  |Silver| 
     WT6 |WT   |Watch  |Gold | 

Ist es möglich, SQL-Abfrage zu schreiben, die eine Zeile mit allen Spalten für jeden PROD_CODE zurückkehren werden? Wenn, was ist es?

Ich hoffe, es gibt eine ANSI SQL-Lösung, da ich sowohl PSQL als auch TSQL verwenden muss. Außerdem spielt die Leistung keine große Rolle, obwohl Tabellen Millionen von Zeilen enthalten können. Dies ist die einmalige Ausführung von Beispieldaten für die Dokumentation.

Zum Beispiel könnte das Ergebnis so aussehen:

 
     CAT_NO |PROD_CODE |DESCRIPTION |COLOR | 
     SH1 |SH   |Shirt  |Blue | 
     BT4 |BT   |Belt  |Brown | 
     WT6 |WT   |Watch  |Gold | 

Eine Zeile für jeden PROD_CODE. Jede Zeile ist akzeptabel.

+0

was sollte das Ergebnis aussehen? –

+0

@vkp hat die Frage so bearbeitet, dass sie ein akzeptables Ergebnis enthält. – Karl

+0

Wenn es egal ist, welche Daten Sie pro Prod_Code zurückbekommen, können Sie 'row_number() over (Partition nach prod_code order by cat_no) als row_num' verwenden und die resultierende Menge nach' row_num = 1' filtern – jpw

Antwort

0

Wenn es keine Rolle spielt, welche Daten Sie per prod_code zurückbekommen können Sie row_number() over (partition by prod_code order by cat_no) as row_num verwenden und filtern die auf row_num = 1 Ergebnismenge.

Etwas wie folgt aus:

SELECT CAT_NO, PROD_CODE, DESCRIPTION, COLOR 
FROM (
    SELECT *, ROW_NUMBER() OVER (PARTITION BY PROD_CODE ORDER BY CAT_NO) AS row_num 
    FROM TABLE 
) t 
WHERE t.row_num = 1 
+0

Danke. Getestet und bekam die gewünschten Ergebnisse. Ich mag deine Antwort besser als meine, weil die 'where' Klausel, wie ich annehme, geändert werden kann, um mehr als eine Beispielzeile pro' PROD_CODE' zurückzugeben. Ist die Klausel 'ORDER BY' erforderlich? – Karl

+1

@Karl Das 'order by' wird benötigt, damit row_number funktioniert (zumindest in t-sql). Wenn Sie mehr Stichproben pro Gruppe wünschen, können Sie die WHERE-Klausel ändern, um höhere Zeilennummern zu ermöglichen. – jpw

1
select * 
from 
( select * 
     , row_number() over (partition by PROD_CODE order by CAT_NO) as rn 
    from table 
) tt 
where tt.rn = 1 
+0

Sie und @jpw haben die selbe Antwort natürlich und ich weiß, dass du zuerst warst, aber als ich anfing, deine anzusehen, fehlte die 'FROM' und sie warf mich ab. – Karl

+0

@Karl Was auch immer. Ich war eine sofortige Bearbeitung und ich war zuerst. Froh, dass du dich erholt – Paparazzi

0

Und das funktioniert auch:

SELECT * 
    FROM TABLE T 
    WHERE T.CAT_NO IN (SELECT MAX(T1.CAT_NO) FROM TABLE T1 GROUP BY PROD_CODE)