powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Запрос на SELECT TOP
9 сообщений из 9, страница 1 из 1
Запрос на SELECT TOP
    #39721529
Vasiliev Anton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго времени суток.
Нужна помощь в запросе типа SELECT TOP
Дана таблица
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
create table #tbl (Item varchar(10), ItemGroup varchar(10), Qnt int)

insert #tbl (Item,ItemGroup,Qnt) values('Товар1','Группа1',3)
insert #tbl (Item,ItemGroup,Qnt) values('Товар2','Группа1',56)
insert #tbl (Item,ItemGroup,Qnt) values('Товар3','Группа1',2)
insert #tbl (Item,ItemGroup,Qnt) values('Товар4','Группа1',85)
insert #tbl (Item,ItemGroup,Qnt) values('Товар5','Группа2',23)
insert #tbl (Item,ItemGroup,Qnt) values('Товар6','Группа2',5)
insert #tbl (Item,ItemGroup,Qnt) values('Товар7','Группа2',6)
insert #tbl (Item,ItemGroup,Qnt) values('Товар8','Группа2',14)
insert #tbl (Item,ItemGroup,Qnt) values('Товар9','Группа2',135)
insert #tbl (Item,ItemGroup,Qnt) values('Товар10','Группа3',63)
insert #tbl (Item,ItemGroup,Qnt) values('Товар11','Группа3',93)
insert #tbl (Item,ItemGroup,Qnt) values('Товар12','Группа3',27)
insert #tbl (Item,ItemGroup,Qnt) values('Товар13','Группа3',12)
insert #tbl (Item,ItemGroup,Qnt) values('Товар14','Группа3',10)
insert #tbl (Item,ItemGroup,Qnt) values('Товар15','Группа3',34)


Необходимо получить TOP 3 товаров с макс. Qtn из каждой группы.
ItemItemGroupQntТовар4Группа185Товар2Группа156Товар1Группа13Товар9Группа2135Товар5Группа223Товар8Группа214Товар11Группа393Товар10Группа363Товар15Группа334

В BOL предложен вариант запроса
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
select Item,ItemGroup,Qnt
from (select top 3 * from #tbl where ItemGroup = 'Группа1' order by Qnt desc) t1
union all
select Item,ItemGroup,Qnt
from (select top 3 * from #tbl where ItemGroup = 'Группа2' order by Qnt desc) t2
union all
select Item,ItemGroup,Qnt
from (select top 3 * from #tbl where ItemGroup = 'Группа3' order by Qnt desc) t3



Но как быть, если неизвестно кол-во групп или фильтр выборки не только по группе, а допустим еще и по магазину. Может есть какое-то решение?
...
Рейтинг: 0 / 0
Запрос на SELECT TOP
    #39721534
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
row_number() over (partition by ItemGroup order by Qnt desc) с последующей фильтрацией.
...
Рейтинг: 0 / 0
Запрос на SELECT TOP
    #39721538
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm,

Или with ties...
...
Рейтинг: 0 / 0
Запрос на SELECT TOP
    #39721549
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
WITH CTE(ItemGroup) AS(SELECT DISTINCT ItemGroup FROM #tbl)
SELECT T.Item,T.ItemGroup,T.Qnt
FROM CTE
CROSS APPLY (SELECT TOP(3) * FROM #tbl TT WHERE TT.ItemGroup=CTE.ItemGroup ORDER BY TT.Qnt DESC) T;

Однако, не проверял!
...
Рейтинг: 0 / 0
Запрос на SELECT TOP
    #39721552
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник

iap
Код: sql
1.
2.
3.
4.
WITH CTE(ItemGroup) AS(SELECT DICTINCT ItemGroup FROM #tbl)
SELECT T.Item,T.ItemGroup,T.Qnt
FROM CTE
CROSS APPLY (SELECT TOP(3) * FROM #tbl TT WHERE TT.ItemGroup=CTE.ItemGroup ORDER BY TT.Qnt DESC) T;


Однако, не проверял!
Какой позор! Написал DISTINCT через "C"! :((

Модератор: Поправил
...
Рейтинг: 0 / 0
Запрос на SELECT TOP
    #39721562
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iap,

авторКакой позор! Написал DISTINCT через "C"! :((
это всё...
...
Рейтинг: 0 / 0
Запрос на SELECT TOP
    #39722338
Vasiliev Anton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
iap,

Да, CROSS APPLY...то что нужно.

Благодарю!
...
Рейтинг: 0 / 0
Запрос на SELECT TOP
    #39722369
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vasiliev AntonДа, CROSS APPLY...то что нужно.Безусловно.
count(distinct ItemGroup) + 1 проходов по таблице всяко лучше одного с row_number()
...
Рейтинг: 0 / 0
Запрос на SELECT TOP
    #39722431
Владимир Затуливетер
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm правильно говорит, его вариант лучше.
Код: sql
1.
2.
3.
select *
from ( select *, row_number() over (partition by ItemGroup order by Qnt desc) as Pos from #tbl ) t
where Pos <= 3
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Запрос на SELECT TOP
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]