首页 > 解决方案 > 按年份选择最小计数('x')

问题描述

我正在尝试创建一个表格,显示按年份播放次数最少的歌曲。

例如,如果 Song1 和 Song2 都只有 1 次播放,而 Song3 在 2018 年有 2 次播放,Song1 在 2017 年有 1 次播放,而 Song2 在 2017 年有 2 次播放,我想要一个返回 3 行的表格:

歌曲 1 - 2018 - 1 场

Song2 - 2018 - 1 场演出

歌曲 1 - 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);

目前我将歌曲按一年的播放次数分组,但我不确定如何只显示播放次数最少的歌曲。

标签: sqloracle

解决方案


--您可以更喜欢使用分析函数,例如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

推荐阅读