Функция ранга всегда возвращает одинаковые значения для каждой группы? - PullRequest
0 голосов
/ 23 октября 2019

Цель: найти 200 лучших треков за последние 3 месяца . потребительские данные для каждой дорожки должны составлять ежедневно .

Я использовал

RANK () OVER(PARTITION BY report_date ORDER BY SUM(num_streams))

Чего я боюсь, так это того, что он вернет мне разные топ-200 за каждый день и Я не хочучто .

Я хочу, чтобы топ 200 оставался неизменным на каждый день . Но с разными данными о потребителях каждый день.

Есть идеи?

Я использую AWS REDSHIFT

Я хочу это:

Day       Track_Title       Consumer_counts       Rank
Jul 1      Halo               600                  1
Jul 1      old town road      200                  2
Jul 1      heartbeat          180                  3
Jul 2      Halo               500                  1
Jul 2      old town road      300                  2
Jul 2      heartbeat          400                  3

Но вместо этого я получаю

 Day       Track_Title       Consumer_counts       Rank
Jul 1      Halo               600                  1
Jul 1      old town road      200                  2
Jul 1      heartbeat          180                  3
Jul 2      Halo               500                  1
Jul 2      wish you were here 400                  2
Jul 2      old town road      300                  3

Ответы [ 2 ]

0 голосов
/ 23 октября 2019

Я думаю, что вы хотите запрос агрегации

select Track_Title, sum(Consumer_counts) as total
       rank() over (order by sum(Consumer_counts) desc) as ranking
from t
where report_date >= current_date - interval '3 month'
group by Track_Title
order by total desc
limit 200;

Если вы хотите, чтобы детализация по дням, то я бы предложил присоединиться к этому обратно в:

with top200 as (
      select Track_Title, sum(Consumer_counts) as total
             rank() over (order by sum(Consumer_counts) desc) as ranking
      from t
      where report_date >= current_date - interval '3 month'
      group by Track_Title
      order by total desc
      limit 200
     )
select t.*, top200.ranking
from t join
     top200
     on t.Track_Title = top200.Track_Title
order by t.report_date, top200.ranking;
0 голосов
/ 23 октября 2019

Если вы хотите, чтобы 200 лучших треков за 3 месяца, а затем получали ежедневный счет, включающий только 200 выбранных треков, вы могли бы сделать что-то вроде этого:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...