2017-08-10 86 views
0

我有以下数据每一天

date   user song 
..........  ..... ..... 
2017-07-12  u1  song1 
2017-07-12  u2  song1 
2017-07-12  u1  song1 
2017-07-12  u2  song2 
2017-07-12  u1  song3 
2017-07-12  u2  song1 
2017-07-12  u1  song2 
2017-07-12  u2  song1 
2017-07-13  u1  song2  
2017-07-13  u2  song2 
2017-07-13  u1  song2 
2017-07-13  u2  song1 
2017-07-13  u1  song1 

我想下面的输出听得最多的歌曲

date      song 
..........     ..... 
2017-07-12     song1 
2017-07-13     song2 

我能得到计数和歌曲名称,但未能就挑顶个我已经使用了以下查询

SELECT 
dt,song_name,count(song_name) as c 
FROM es_session GROUP BY 
dt,song_name order by c,dt DESC 

回答

1

您正在查找的内容在统计中称为“模式”。你可以使用窗口函数来计算它:

SELECT ds.* 
FROM (SELECT dt, song_name, count(song_name) as c, 
      ROW_NUMBER() OVER (PARTITION BY dt ORDER BY COUNT(song_name) DESC) as seqnum 
     FROM es_session 
     GROUP BY dt, song_name 
    ) ds 
WHERE seqnum = 1 
ORDER BY c, dt DESC ; 

如果有重复,这将选择一个任意值。如果你想要所有这些,请使用RANK()而不是ROW_NUMBER()

+0

一位用户多次听过一首歌。用户必须被视为一个独特的字段 – sri