[英]SQL Query: CREATE a table with rows divided by month/year and COUNT the number of values WHERE '01/month/year' IS BETWEEN two date-columns
这是我的第一个问题。
我在创建复杂查询以根据月/年的第一天是否落在两个日期列之间对值进行分组时遇到问题。
这是我的表格示例:
用户身份 | 开始日期 | 结束日期 |
---|---|---|
一种 | 03/07/2020 | 31/07/2020 |
一种 | 05/06/2020 | 03/07/2020 |
一种 | 08/05/2020 | 05/06/2020 |
一种 | 10/04/2020 | 08/05/2020 |
乙 | 13/02/2020 | 12/03/2020 |
乙 | 16/01/2020 | 13/02/2020 |
C | 22/05/2020 | 19/06/2020 |
C | 24/04/2020 | 22/05/2020 |
丁 | 25/09/2020 | 23/10/2020 |
丁 | 28/08/2020 | 25/09/2020 |
丁 | 31/07/2020 | 28/08/2020 |
丁 | 03/07/2020 | 31/07/2020 |
丁 | 05/06/2020 | 03/07/2020 |
乙 | 25/11/2020 | 23/12/2020 |
乙 | 28/10/2020 | 25/11/2020 |
乙 | 30/09/2020 | 28/10/2020 |
F | 14/2/2020 | 13/3/2020 |
F | 17/1/2020 | 14/2/2020 |
F | 20/12/2019 | 17/1/2020 |
F | 22/11/2019 | 20/12/2019 |
G | 2020 年 7 月 11 日 | 2020 年 5 月 12 日 |
G | 10/10/2020 | 2020 年 7 月 11 日 |
我希望有这样的东西:
年 | 月 | 计数(不同的用户 ID) |
---|---|---|
2019 | 11 | 0 |
2019 | 12 | 1个 |
2020 | 1个 | 1个 |
2020 | 2个 | 2个 |
2020 | 3个 | 2个 |
2020 | 4个 | 0 |
2020 | 5个 | 2个 |
2020 | 6个 | 2个 |
2020 | 7 | 2个 |
2020 | 8个 | 1个 |
2020 | 9 | 1个 |
2020 | 10 | 2个 |
2020 | 11 | 2个 |
2020 | 12 | 2个 |
例如,在 2020 年 2 月,用户“B”和用户“F”的日期范围包括日期 01/Feb/2020(条件适用于:
用户身份 | 开始日期 | 结束日期 |
---|---|---|
乙 | 16/01/2020 | 13/02/2020 |
并为:
用户身份 | 开始日期 | 结束日期 |
---|---|---|
F | 17/1/2020 | 14/2/2020 |
...所以计数将为 2。
您知道在 SQL(或 Ruby)中执行此操作的任何方法吗?
非常感谢!
尝试这个:
WITH m AS
( SELECT generate_series(min(date_trunc('month', start_date)), max(end_date), '1 month') :: date AS month
FROM my_table AS t
)
SELECT to_char(m.month, 'YYYY') AS year
, to_char(m.month, 'MM') AS month
, count(DISTINCT t.user_id) AS "count(distinct user_id)"
FROM my_table AS t
RIGHT JOIN m
ON daterange(t.start_date, t.end_date) @> m.month
GROUP BY m.month
ORDER BY m.month
第一个查询"m"
计算涵盖my_table
的start_date
和end_date
的月份列表。
第二个查询将my_table
与结果表"m"
连接起来,以便 select 间隔daterange(start_date, end_date)
包含该月第一天的所有用户(请参阅手册)。
然后按m.month
对行进行分组,并使用count(DISTINCT user_id)
聚合 function 计算每月不同 user_id 的数量(请参阅手册)。
最后, RIGHT JOIN
子句允许 select 在my_table
中没有相应user_id
的月份(请参阅手册)。
查看dbfiddle中的测试结果。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.