Как получить длинную запись для строк с повторяющимися ключами? - PullRequest
0 голосов
/ 24 октября 2019

Учитывая, что в следующей таблице отсутствует какой-либо уникальный ключ, как я могу сгруппировать по идентификатору и получить столбец Permissions с самой длинной длиной?

SampleTable:

id | Permissions
------------------------------------
1  | Walk, Swim
1  | Walk, Sit, Swim, Run, Jump, Lay
1  | !Walk, Sit, Lay
2  | Walk, Sit, Swim
3  | !Walk, Sit, Swim
3  | Walk, Sit, Swim

Я пытался:

SELECT r.id, r.Permissions
FROM SampleTable AS r
CROSS APPLY (
    SELECT TOP 1 u.id, u.Permissions
    FROM SampleTable AS u
    GROUP BY u.id, u.Permissions
    HAVING u.id = r.id
    ORDER BY MAX(LEN(Permissions)) DESC
) AS u

Однако я не получил правильных результатов.

Я ищу такие результаты, как:

id | Permissions
-----------------------------------
1 | Walk, Sit, Swim, Run, Jump, Lay
2 | Walk, Sit, Swim
3 | !Walk, Sit, Swim

Редактировать:На это уже ответили, спасибо. Но кроме этого, я должен был иметь свой SQL как:

SELECT r.id, u.Permissions
FROM SampleTable AS r
CROSS APPLY (
    SELECT TOP 1 u.id, u.Permissions
    FROM SampleTable AS u
    WHERE u.id = r.id
    ORDER BY LEN(Permissions) DESC
) AS u
GROUP BY r.id, u.Permissions

Ответы [ 2 ]

5 голосов
/ 24 октября 2019

вы можете использовать row_number () over (). такие как:

with cte as (
    Select id, Permissions
    row_number() over( partition by id order by LEN(Permissions) desc) as rnum
    from SampleTable
) Select id, Permissions from cte where rnum = 1
0 голосов
/ 24 октября 2019

Это буквально ', у которого самый длинный?' конкурс!

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


SELECT p2.id, p2.permissions
FROM table1 p2
JOIN (SELECT p.id, MAX(LEN(p.permissions)) AS longest FROM table1 p GROUP BY p.id) 
p1 ON p1.id = p2.id
AND p1.longest = Len(p2.permissions)

Тест

--drop table if exists table1
create table table1 ( id int, permissions nvarchar(100));

insert into table1 values(1, 'Walk, Swim');
insert into table1 values(1, 'Walk, Sit, Swim, Run, Jump, Lay');
insert into table1 values(1, '!Walk, Sit, Lay');
insert into table1 values(2, 'Walk, Sit, Swim');
insert into table1 values(3, '!Walk, Sit, Swim');
insert into table1 values(3, 'Walk, Sit, Swim');

SELECT p2.id, p2.permissions
FROM table1 p2
JOIN (SELECT p.id, MAX(LEN(p.permissions)) AS longest FROM table1 p GROUP BY p.id) 
p1 ON p1.id = p2.id
AND p1.longest = Len(p2.permissions)

Выход

id  permissions
1   Walk, Sit, Swim, Run, Jump, Lay
2   Walk, Sit, Swim
3   !Walk, Sit, Swim

Несколько «длинных»

(...)
insert into table1 values(1, 'Walk, Swim');
insert into table1 values(1, 'Walk, Sit, Swim, Run, Jump, Lay');
insert into table1 values(1, '!Walk, Sit, Lay');
insert into table1 values(2, 'Walk, Sit, Swim');
insert into table1 values(3, '!Walk, Sit, Swim');
insert into table1 values(3, 'Walk, Sit, Swim');
insert into table1 values(3, '!Walk, Run, Swim'); -- extra record

Выход:

id  permissions
1   Walk, Sit, Swim, Run, Jump, Lay
2   Walk, Sit, Swim
3   !Walk, Sit, Swim
3   !Walk, Run, Swim
...