Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Запрос на SELECT TOP / 9 сообщений из 9, страница 1 из 1
23.10.2018, 16:13
    #39721529
Vasiliev Anton
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос на SELECT TOP
Доброго времени суток.
Нужна помощь в запросе типа 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
23.10.2018, 16:20
    #39721534
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос на SELECT TOP
row_number() over (partition by ItemGroup order by Qnt desc) с последующей фильтрацией.
...
Рейтинг: 0 / 0
23.10.2018, 16:28
    #39721538
Щукина Анна
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос на SELECT TOP
invm,

Или with ties...
...
Рейтинг: 0 / 0
23.10.2018, 16:46
    #39721549
iap
iap
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос на SELECT TOP
Код: 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
23.10.2018, 16:47
    #39721552
iap
iap
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос на SELECT TOP

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
23.10.2018, 17:01
    #39721562
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос на SELECT TOP
iap,

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

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

Благодарю!
...
Рейтинг: 0 / 0
24.10.2018, 17:51
    #39722369
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос на SELECT TOP
Vasiliev AntonДа, CROSS APPLY...то что нужно.Безусловно.
count(distinct ItemGroup) + 1 проходов по таблице всяко лучше одного с row_number()
...
Рейтинг: 0 / 0
24.10.2018, 18:52
    #39722431
Владимир Затуливетер
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос на SELECT TOP
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
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Запрос на SELECT TOP / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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