SQL: Получить лучшие записи по категориям, за день, по стране? - PullRequest
0 голосов
/ 31 января 2020

Немного сложнее, чем просто получить топ # в категории. Мне нужны 2 лучших видео на исполнителя, в день на страну.

Мой код, который не дал мне правильных результатов:

    Select * 
    From 
   (
    Select t2.*, dense_rank() over(partition by artist order by views desc)
    From
      (select country, day, artist, song, sum(view) as views
        From t1 
        Group by 1,2,3,4
        ) t2
    )
Where rn >=5 

Пример результатов данных

| Country | Date | artist   | video | views | rn |
|---------|------|----------|-------|-------|----|
| US      | Jan1 | Beyonce  | ab    | 100   | 1  |
| US      | Jan1 | Beyonce  | ac    | 99    | 2  |
| US      | Jan2 | C. Brown | ad    | 89    | 1  |
| US      | Jan2 | C. Brown | ai    | 103   | 2  |
| AU      | Jan1 | Beyonce  | bf    | 99    | 1  |
| AU      | Jan1 | Beyonce  | bb    | 89    | 2  |

Я хочу, чтобы все художники в день, в каждой стране, но только 10 видео на исполнителя ... Я немного растерялся, как этого добиться ... Я вообще изо всех сил, когда дело доходит до оконных функций, поэтому я был бы признателен за любую помощь .

Я использую Amazon Redshift

Спасибо

Ответы [ 2 ]

2 голосов
/ 31 января 2020

Вам необходимо разделить все столбцы, которые вы упомянули, поскольку вы ранжируете представления в каждой комбинации этих элементов. Поскольку вы переименовали агрегатный столбец в «представления», вам нужно называть его по этому имени. Наконец, если вы хотите 2 лучших видео / песни, используйте это условие: где rn <= 2 </p>

   Select * 
    From 
   (
    Select t2.*, dense_rank() over(partition by country, day, artist order by views desc)
    From
      (select country, day, artist, song, sum(views) as views
        From t1 
        Group by 1,2,3,4
        ) t2
    )
Where rn <= 2
2 голосов
/ 31 января 2020

Это будет ранжировать по исполнителю за день в просмотрах и показывать два по каждому исполнителю за день

    Select * 
    From 
   (
    Select t2.*, ROW_NUMBER() over(partition by artist, day, country order by views desc) as rn
    From t1  t2
    )
Where rn <= 2
...