繁体   English   中英

SQL 查询:创建一个表,其中的行按月/年划分,并计算值的数量,其中“01/月/年”介于两个日期列之间

[英]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_tablestart_dateend_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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM