Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Определение топа записей на каждый период.  [new]
ToastedHippy
Member

Откуда:
Сообщений: 12
Доброго времени суток.

Помогите решить такую задачку:
Нужно выбрать топ 10 стран импортеров на каждую дату. Даты могут обозначать как кварталы, так и полугодия и года.
Периоды разделяются по полю DL конкретными значениями (кварт - 3, полуг - 2, года - 1) Т.е. число "2014-01-01" может обозначать как 1 квартал 2014г, так и 1е полугодие 2014г, так и 2014г. Также если страна входит в топ хотя бы по 1 дате периода, то нужно выводить место этой страны и по остальным датам периода чтобы можно было посчитать показатель "изменение рейтинга".
Т.е. например, из таблицы (vl - объем импорта в млн $):

country date dl vl
Азарбайджан 2007-01-01 1 20
Китай 2007-01-01 1 21
Россия 2007-01-01 1 14
США 2007-01-01 1 15
Азарбайджан 2008-01-01 1 22
Китай 2008-01-01 1 18
США 2008-01-01 1 20
Россия 2008-01-01 1 17


нужно получить топ 2 страны. Но т.к. США в 2008 году занимает 2 место, а Китай в 2007 занимает 1 место, то нужно отобразить и США и Китай по обоим периодам. Т.е. должна получиться таблица:

country date dl vl
Китай 2007-01-01 1 1
Азарбайджан 2007-01-01 1 2
США 2007-01-01 1 3
Азарбайджан 2008-01-01 1 1
США 2008-01-01 1 2
Китай 2008-01-01 1 3
14 сен 14, 10:41    [16573396]     Ответить | Цитировать Сообщить модератору
 Re: Определение топа записей на каждый период.  [new]
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]     Ответить | Цитировать Сообщить модератору
 Re: Определение топа записей на каждый период.  [new]
ToastedHippy
Member

Откуда:
Сообщений: 12
Большое спасибо. Конечно вот это
15 сен 14, 06:33    [16574722]     Ответить | Цитировать Сообщить модератору
 Re: Определение топа записей на каждый период.  [new]
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]     Ответить | Цитировать Сообщить модератору
 Re: Определение топа записей на каждый период.  [new]
aleks2
Guest
ToastedHippy
Случайно опубликовал предыдущую запись :). Правда, вот это
(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.
Но на решение натолкнул.


Страдалец! Учиться надо.

(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]     Ответить | Цитировать Сообщить модератору
 Re: Определение топа записей на каждый период.  [new]
ToastedHippy
Member

Откуда:
Сообщений: 12
aleks2
Страдалец! Учиться надо.

Этим я и занимаюсь. Спасибо еще раз!
15 сен 14, 09:49    [16574940]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить