Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
ToastedHippy Member Откуда: Сообщений: 12 |
Доброго времени суток. Помогите решить такую задачку: Нужно выбрать топ 10 стран импортеров на каждую дату. Даты могут обозначать как кварталы, так и полугодия и года. Периоды разделяются по полю DL конкретными значениями (кварт - 3, полуг - 2, года - 1) Т.е. число "2014-01-01" может обозначать как 1 квартал 2014г, так и 1е полугодие 2014г, так и 2014г. Также если страна входит в топ хотя бы по 1 дате периода, то нужно выводить место этой страны и по остальным датам периода чтобы можно было посчитать показатель "изменение рейтинга". Т.е. например, из таблицы (vl - объем импорта в млн $):
нужно получить топ 2 страны. Но т.к. США в 2008 году занимает 2 место, а Китай в 2007 занимает 1 место, то нужно отобразить и США и Китай по обоим периодам. Т.е. должна получиться таблица:
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
14 сен 14, 10:41 [16573396] Ответить | Цитировать Сообщить модератору |
aleks2
Guest |
declare @top int = 10; ;with all_tops as (select distinct country from aTable where row_number() over(partition by DL, date order by VL desc) <= @top ) select * from aTable where row_number() over(partition by DL, date order by VL desc) <= @top or country in ( select country from all_tops ) |
14 сен 14, 15:02 [16573609] Ответить | Цитировать Сообщить модератору |
ToastedHippy Member Откуда: Сообщений: 12 |
Большое спасибо. Конечно вот это |
15 сен 14, 06:33 [16574722] Ответить | Цитировать Сообщить модератору |
ToastedHippy Member Откуда: Сообщений: 12 |
Случайно опубликовал предыдущую запись :). Правда, вот это(select distinct country from aTable where row_number() over(partition by DL, date order by VL desc) <= @top ) выдает ошибку Windowed functions can only appear in the SELECT or ORDER BY clauses. Но на решение натолкнул. |
15 сен 14, 06:39 [16574724] Ответить | Цитировать Сообщить модератору |
aleks2
Guest |
Страдалец! Учиться надо. (select distinct country from (select *, row_number() over(partition by DL, date order by VL desc) n from aTable ) x where n <= @top ) |
||
15 сен 14, 07:45 [16574759] Ответить | Цитировать Сообщить модератору |
ToastedHippy Member Откуда: Сообщений: 12 |
Этим я и занимаюсь. Спасибо еще раз! |
||
15 сен 14, 09:49 [16574940] Ответить | Цитировать Сообщить модератору |
Все форумы / Microsoft SQL Server | ![]() |