我正在尝试创建一个表格,该表格按年份显示播放次数最少的歌曲。
例如,如果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);
目前,我将歌曲按一年的播放次数分组,但是我不确定如何只显示播放次数最少的歌曲。
答案 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(),
]