Вопрос по sql, sql-server – T-SQL Группировка строк из столбцов MAX длины в разных строках (?)

3

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

пример

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

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

<code>1   Winchester Road,    crawley estate, P21869A
2   Smith Close,    birmingham North East,  P53342B
</code>

EDIT: приведенные выше результаты должны быть в таблице, а не просто через запятую

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

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

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

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

Спасибо

Бен.

Спасибо за настольные скрипты! Quassnoi
добро пожаловать! Я подумал, что если я хочу получить ответ, мне нужно, чтобы люди могли легко проводить собственные тесты. Ben O

Ваш Ответ

2   ответа
1

но, по крайней мере, работает (на 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 миллионов ... Я пробовал и этот подход, и один подзапрос, основанный на одном, и посмотрел планы выполнения: I 'ld на самом деле было бы интересно узнать

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded Ben O
Error: User Rate Limit Exceeded Ben O
Error: User Rate Limit Exceeded Ben O
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

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

Edit: У меня может не быть возможности закончить это сегодня, но 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)
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded Ben O

Похожие вопросы