2009-06-26 10 views
3

Ich versuche, Zeilen in einer Tabelle basierend auf der längsten Zeichenfolge in einer beliebigen Zeile basierend auf einem Zeilenschlüssel zu kombinierenT-SQL Gruppierung von Zeilen aus den MAX-Längenspalten in verschiedenen Zeilen (?)

Beispiel

CREATE TABLE test1 
    (akey int not null , 
    text1 varchar(50) NULL, 
    text2 varchar(50) NULL, 
    text3 varchar(50) NULL ) 


INSERT INTO test1 VALUES (1,'Winchester Road','crawley',NULL) 
INSERT INTO test1 VALUES (1,'Winchester Rd','crawley','P21869') 
INSERT INTO test1 VALUES (1,'Winchester Road','crawley estate','P21869') 
INSERT INTO test1 VALUES (1,'Winchester Rd','crawley','P21869A') 
INSERT INTO test1 VALUES (2,'','birmingham','P53342B') 
INSERT INTO test1 VALUES (2,'Smith Close','birmingham North East','P53342') 
INSERT INTO test1 VALUES (2,'Smith Cl.',NULL,'P53342B') 
INSERT INTO test1 VALUES (2,'Smith Close','birmingham North','P53342') 

mit diesen Zeilen i für das Ergebnis der Suche wäre:

1 Winchester Road, crawley estate, P21869A 
2 Smith Close, birmingham North East, P53342B 

EDIT: die Ergebnisse müssen für in einer Tabelle Rathe sein r als nur eine durch Komma getrennte Zeichenkette

Wie Sie im Ergebnis sehen können, sollte die Ausgabe die längste Textspalte im Bereich des Felds 'akey' sein.

ich versuche, eine Lösung zu finden, die nicht viele Unterabfragen für jede Spalte enthält, die tatsächliche Tabelle hat 32 Spalten und über 13 Millionen Zeilen.

der Grund, warum ich das tue ist eine aufgeräumte Tabelle zu erstellen, die die besten Ergebnisse in jeder Spalte pro Zeile für nur eine ID

dies ist mein erster Beitrag, so lassen Sie mich, wenn Sie wissen, hat müssen keine weiteren Informationen, und ich freue mich über alle Best Practices über das Posting, dass ich gebrochen habe!

danke

Ben.

+0

Danke für die Tabelle Skripte! – Quassnoi

+0

Gern geschehen! Ich dachte, wenn ich eine Antwort will, muss ich es einfach machen, dass Leute ihre eigenen Tests durchführen. –

Antwort

2
SELECT A.akey, 
    (
     SELECT TOP 1 T1.text1 
     FROM test1 T1 
     WHERE T1.akey=A.akey AND LEN(T1.TEXT1) = MAX(LEN(A.text1)) 
    ) AS TEXT1, 
    (
     SELECT TOP 1 T2.text2 
     FROM test1 T2 
     WHERE T2.akey=A.akey AND LEN(T2.TEXT2) = MAX(LEN(A.text2)) 
    ) AS TEXT2, 
    (
     SELECT TOP 1 T3.text3 
     FROM test1 T3 
     WHERE T3.akey=A.akey AND LEN(T3.TEXT3) = MAX(LEN(A.text3)) 
    ) AS TEXT3 
FROM TEST1 AS A 
GROUP BY A.akey 

Ich habe gerade festgestellt, Sie haben gesagt, Sie haben 32 Spalten. Ich sehe keinen guten Weg, dies zu tun, es sei denn, UNPIVOT würde Ihnen erlauben, separate Zeilen (akey, textn) für jede Text * -Spalte zu erstellen.

Edit: Ich kann nicht eine Chance haben, dies heute zu beenden, aber UNPIVOT sieht nützlich:

; 
WITH COLUMNS AS 
(
    SELECT akey, [Column], ColumnValue 
    FROM 
     (
      SELECT X.Akey, X.Text1, X.Text2, X.Text3 
      FROM test1 X 
     ) AS p 
    UNPIVOT (ColumnValue FOR [Column] IN (Text1, Text2, Text3)) 
    AS UNPVT 
) 
SELECT * 
FROM COLUMNS 
ORDER BY akey,[Column], LEN(ColumnValue) 
+0

dass pivot sieht promising, ich habe nicht viel/pivot verwendet. Ich nehme an, wir müssen dann die Daten PIVOT, nachdem wir die längsten Strings ausgewählt haben? –

+0

Ja, ich denke du brauchst PIVOT. –

1

Dies scheint wirklich hässlich, aber funktioniert am wenigsten (auf SQL2K) und braucht nicht Subqueries :

select test1.akey, A.text1, B.text2, C.text3 
from test1 
inner join test1 A on A.akey = test1.akey 
inner join test1 B on B.akey = test1.akey 
inner join test1 C on C.akey = test1.akey 
group by test1.akey, A.text1, B.text2, C.text3 
having len(a.text1) = max(len(test1.text1)) 
    and len(B.text2) = max(len(test1.text2)) 
    and len(C.text3) = max(len(test1.text3)) 
order by test1.akey 

ich muss zugeben, dass es eine innere Verknüpfung für jede Spalte muss und ich frage mich, wie diese auf den 32 Spalten x 13millions Satztabelle auswirken könnte ... ich versuche, beide dieser Ansatz und die eine Basis eines Unterabfragen und sah Ausführungen pla ns: Ich wäre eigentlich neugierig zu wissen

+0

danke, das funktioniert gut für die Beispieltabelle, aber ich bin ungern zu tun ~ 32 Tabellen-Scans in 13m Zeilen. –

+0

.. ich werde beide Methoden ausprobieren um zu sehen was besser läuft, sowohl für unsere Neugierde. –

+1

Ergebnisse sind die Unterabfrage-Methode von John ist nach den Ausführungsplänen wesentlich effizienter. –

Verwandte Themen