按年份选择最小计数('x')

时间:2019-04-09 22:28:06

标签: sql oracle

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

例如,如果Song1和Song2在2018年都只有1场比赛,而Song3在2场中只有2场比赛,而Song1在2017年有1场比赛,而Song2在2017年有2场比赛,我想要一个表将返回3行:

歌曲1-2018-1场

歌曲2-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 个答案:

答案 0 :(得分:1)

-您可能更喜欢使用诸如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

答案 1 :(得分:0)

您可以尝试使用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;

答案 2 :(得分:0)

这应该有效。这也是为什么我们应该使用WITH(子查询分解)而不是嵌入式视图的一个很好的例子。使用年份,song_code和count创建一个song_count子查询。

此外,为了清楚起见,我将明确定义联接

import { MDBBootstrapModule } from 'angular-bootstrap-md';
 imports: [
MDBBootstrapModule.forRoot(),
 ]