Выбор минимального количества ('х') по году - PullRequest
0 голосов
/ 10 апреля 2019

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

Например, если у Song1 и Song2 было только 1 воспроизведение, а у Song3 было 2 воспроизведения в 2018 году, а у Song1 было 1 воспроизведение в 2017 году, а у Song2 было 2 воспроизведения в 2017 году, я хочу таблицу, которая будет возвращать 3 строки:

Song1 - 2018 - 1 воспроизведение

Song2 - 2018 - 1 воспроизведение

Song1 - 2017 - 1 воспроизведение

Есть ли способ отобразить песни, где min (count ('x')) = count (' x ').Я уверен, что это не правильный синтаксис, но по сути это то, что я пытаюсь найти.

SELECT * FROM music 
NATURAL JOIN (SELECT extract(year from date) AS yr, song_code, COUNT('x') 
FROM singles NATURAL JOIN plays 
GROUP BY extract(year from date), song_code
ORDER BY yr desc, COUNT('x') desc);

В настоящее время у меня есть песни, сгруппированные по количеству пьес в год, но я не уверенкак показать только те, которые сыграли минимальное количество раз.

Ответы [ 3 ]

1 голос
/ 10 апреля 2019

- Вы можете предпочесть использование аналитических функций, таких как dense_rank(), а не объединений или вложенных запросов.

with songs( id, year, play_id ) as
(
 select 1, 2018, 1 from dual union all    
 select 2, 2018, 1 from dual union all    
 select 3, 2018, 1 from dual union all
 select 3, 2018, 2 from dual union all
 select 1, 2017, 1 from dual union all 
 select 2, 2017, 1 from dual union all
 select 2, 2017, 2 from dual
)
select id, year, play_cnt
from
  (select s.*, dense_rank() over (partition by year order by play_cnt) dr
   from 
      (select id, year, count(play_id) as play_cnt
       from songs s
       group by id, year
      ) s
  )
where dr = 1;

        ID       YEAR   PLAY_CNT
---------- ---------- ----------
         1       2017          1
         2       2018          1
         1       2018          1
0 голосов
/ 10 апреля 2019

Это должно работать. Это также хороший пример того, почему мы должны использовать WITH (подзапрос-факторинг) вместо встроенного представления. создание подзапроса song_count с указанием года, song_code и количества.

Кроме того, я бы определенно определил соединения для ясности

WITH song_count as 
    SELECT extract(year from date) AS song_year, song_code, count(*) as play_count
    FROM singles NATURAL JOIN plays
    group by extract(year from date),song_code
select * from song_count
where
 (song_year,play_count) in (select song_year,min(play_count) from song_count group by song_year)
0 голосов
/ 10 апреля 2019

Вы можете попробовать с row_number ():

SELECT * 
FROM music 
NATURAL JOIN 
 (select yr, song_code, play_count
 from 
   (SELECT extract(year from date) AS yr, song_code, COUNT('x') play_count, row_number() over (partition by  extract(year from date), song_code order by COUNT('x')) rn
    FROM singles NATURAL JOIN plays 
    GROUP BY extract(year from date), song_code
   )
   where rn = 1;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...