T-SQL Группировка строк из столбцов MAX длины в разных строках (?) - PullRequest
3 голосов
/ 26 июня 2009

Я пытаюсь найти способ объединения строк в таблице на основе самой длинной строки в любой из строк на основе ключа строки

пример

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')

с этими строками я бы искал результат:

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

РЕДАКТИРОВАТЬ : приведенные выше результаты должны быть в таблице, а не просто через запятую

Как видно из результата, вывод должен быть самым длинным текстовым столбцом в диапазоне поля 'akey'.

Я пытаюсь найти решение, которое не включает много подзапросов в каждом столбце, в реальной таблице 32 столбца и более 13 миллионов строк.

причина, по которой я это делаю, состоит в том, чтобы создать очищенную таблицу, которая имеет наилучшие результаты в каждом столбце только для одного идентификатора в строке

это мой первый пост, так что дайте мне знать, если вам нужна дополнительная информация, и я рад услышать о любых передовых практиках публикации, которые я нарушил!

спасибо

Бен.

Ответы [ 2 ]

2 голосов
/ 26 июня 2009
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

Я только что понял, что вы сказали, что у вас есть 32 столбца. Я не вижу хорошего способа сделать это, если только UNPIVOT не позволит вам создать отдельные строки (akey, textn) для каждого столбца text *.

Редактировать: У меня может не быть возможности закончить это сегодня, но UNPIVOT выглядит полезным:

;
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)
1 голос
/ 26 июня 2009

Это кажется действительно уродливым, но, по крайней мере, работает (на SQL2K) и не требует подзапросов:

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

Я должен признать, что для каждого столбца требуется внутреннее соединение, и мне интересно, как это может повлиять на таблицу записей 32 столбца x 13 миллионов ... Я пробовал и этот подход, и один подзапрос, основанный на одном, и посмотрел планы выполнения: Мне действительно было бы интересно узнать

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...