2016-02-12 79 views
2

我试图找到出现每年最下表中的USER_ID另一列值的金额: 接收者(MSGID,USER_ID,time_read)你怎么能指望的时候一个值出现在SQL

我可以找到不同的年值:

SELECT DISTINCT EXTRACT(YEAR FROM time_read) as years FROM Recipients 

我可以找到,如果我硬编码在今年出现,每年的大部分USER_ID:

SELECT user_ID u, cnt FROM(SELECT user_ID, COUNT(user_ID) cnt FROM Recipients WHERE EXTRACT(YEAR FROM time_read) = '2014' GROUP BY user_ID ORDER BY cnt DESC); 

但我想不出如何将这些结合起来,以得到一个表,列出每年出现最多的user_ID。

感谢

+0

这个问题怎么可能是mysql和oracle。请选择一个平台 – Hogan

+1

那么,哪个RDBMS? – Strawberry

+0

对不起,一定有意外点击mysql – Upgrayded

回答

1

这给一试:

SELECT user_ID, count(user_ID) as cnt, EXTRACT(YEAR FROM time_read) as year 
    FROM RECIPIENTS 
    GROUP BY EXTRACT(YEAR FROM time_read), user_ID 
    ORDER BY year ASC, cnt DESC 
+0

我想你需要一个子查询,如果你想按这些列名进行排序的话。 – Hogan

+0

关闭,它将user_ID分开并每年统计它们,但它不仅显示每年的最大值。 – Upgrayded

+0

sqlfiddle here:http://sqlfiddle.com/#!9/bd332e/1/0 –

1

有可能是一个更简单的方式做到这一点比这个,但我认为这将完成的最终目标:

with counts as (
    select 
    user_id, extract (year from time_read) as year_id, 
    count (*) as cnt 
    from 
    Recipients 
    group by 
    user_id, extract (year from time_read) 
), 
max_values as (
    select 
    user_id, year_id, cnt, 
    max (cnt) over (partition by year_id) as max_cnt 
    from counts 
) 
select 
    user_id, year_id, cnt 
from max_values 
where cnt = max_cnt 

有可能你有两个或两个以上的用户,在这种情况下,这将列出他们两个。如果您想打破平局,您必须在分析功能中使用row_number()而不是count(1)

相关问题