每位用户每天阅读的文档

时间:2016-03-31 10:47:38

标签: sql sql-server

我有下表:

user_id    document_id    date
------------------------------------
1           1             2016-01-01
1           2             2016-01-01
1           3             2016-01-02
2           4             2016-01-01
2           5             2016-01-02
3           6             2016-01-02
3           7             2016-01-02
3           8             2016-01-02
3           9             2016-01-03
3          10             2016-01-03
3          11             2016-01-04
3           9             2016-01-04

我想概述一下:(a)表格中的每一天(b)每位用户阅读了多少文件,如下:

date          user_id    document_count
---------------------------------------
2016-01-01    1          2
2016-01-01    2          1
2016-01-01    3          0
2016-01-02    1          1
2016-01-02    2          1
2016-01-02    3          3
2016-01-03    1          0
2016-01-03    2          0
2016-01-03    3          2
2016-01-04    1          0
2016-01-04    2          0
2016-01-04    3          2

我只知道如何通过按日期分组来获取每天(1)文档或(2)每天用户的结果,并对另一方进行计数。但是在这里我必须按用户和日期分组,我不知道该怎么做。

出于学习目的,我如何才能实现以下相关结果?它可能需要不同的分组顺序,但我不确定。

user_id    date         document_count
--------------------------------------
1          2016-01-01   1
1          2016-01-02   1
1          2016-01-03   0
1          2016-01-04   0
2          2016-01-01   1
2          2016-01-02   1
2          2016-01-03   0
2          2016-01-04   0
3          2016-01-01   0
3          2016-01-02   3
3          2016-01-03   2
3          2016-01-04   2

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:2)

这很棘手,因为“0”计数。也就是说,您需要一个没有输入的输出行。

您的问题明确指出您只关心数据中的日期。这很方便 - 无需生成日期。

第一步是使用CROSS JOIN生成所有输出行。第二种方法是使用LEFT JOINGROUP BY来获取您想要的信息:

select d.date, t.user_id, count(*)
from (select distinct date from t) d cross join
     (select distinct user_id from t) u left join
     t
     on t.date = d.date and t.user_id = u.user_id
group by d.date, t.user_id
order by d.date, t.user_id;

答案 1 :(得分:1)

请检查以下SELECT脚本

"int"

您好, 我已经通过添加DATES表更新了上面的SELECT 请查看下面的SQL脚本

    contours,hierarchy = cv2.findContours(dst,1,2)
    cnt = contours[0]
    l = len(contours)
    print l
    li = list(contours)
    print li

如果您想获得针对您的案例创建日期表的详细信息,可以使用递归CTE表达式检查SQL教程如何create dates table in SQL Server