Получить строку, которая имеет значение Max для двух столбцов в MySql - PullRequest
0 голосов
/ 04 мая 2018

у меня есть таблица, содержащая столбцы id, primaryid, data, dataname, которые я хочу только строки, для которых есть максимальный идентификатор и primaryid

create table #temp
(
    id int,
    primaryid int,
    data   nvarchar(20),
    data_name   nvarchar(30)
)


insert into #temp
values (1,1,'3223sfd','434'),(1,2,'sdfsd','dfsdfsd'),
       (1,3,'sdfs897d','898'),(1,4,'898','545'),(1,5,'898','uuyu'),
       (2,1,'3223sfd','434'),(2,2,'sdfsd','dfsdfsd'),
       (2,3,'sdfs897d','898'),(2,4,'898','545'),(2,5,'898','uuyu')

Я достигаю этого с помощью запроса ниже

select T.id , T.primaryid , T.data , T.data_name from #temp T , (select ID, max(primaryid) rank from #temp t2  group by id ) as T2
where t.primaryid = t2.rank group by T.id , T.primaryid , T.data , T.data_name

но в моей таблице более 100 тыс. Записей, я хочу об этом беспокоиться

Какой будет оптимизированный запрос для этого?

Ответы [ 3 ]

0 голосов
/ 04 мая 2018

Сначала вы должны создать index на id и primaryid, а затем использовать объединение, как показано ниже:

SELECT T.id , T.primaryid , T.data , T.data_name FROM #temp T
JOIN (select id, max(primaryid) as primaryid from #temp t2  group by id ) as T2
ON T.id = t2.id and t.primaryid = t2.primaryid
0 голосов
/ 04 мая 2018

Похоже, вы используете SQL Server. Если это так, один из методов:

select top (1) with ties t.*
from #temp t
order by row_number() over (partition by id order by primaryid desc);
0 голосов
/ 04 мая 2018

Вы можете использовать subquery здесь:

select * 
from #temp t
where primaryid = (select max(tt.primaryid) from #temp tt where tt.id = t.id);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...