这是我在这里的第一个问题。
我在创建一个复杂的查询以根据月份/年份的第一天是否位于两个日期列之间对值进行分组时遇到了问题。
这是我的表格的一个例子:
USER_ID | START_DATE | END_DATE | |
---|---|---|---|
A | 2020年7月3日 | 2020年07月31日||
A | 2020年6月5日 | 20200年7月3日 | |
A | 2020年5月8日 | 20200年6月5日 | |
A | 2020年4月10日 | 20200年5月8日 | |
B | 2020年2月13日 | 2020||
B | 2020年1月16日 | 2020||
C | 2020年5月22日 | 2020||
C | 2020年4月24日 | 2020||
D | 2020年9月25日 | 202010年10月23日 | |
D | 2020年8月28日 | 2020||
D | 2020年7月31日 | 2020||
D | 2020年7月3日 | 2020||
D | 2020年6月5日 | 2020||
E | 2020年11月25日 | 20200年12月23日 | |
E | 2020年10月28日 | 2020||
E | 2020年9月30日 | 2020||
F | 2020年2月14日 | 2020年3月13日 | |
F | 2020年1月17日 | 2020年2月14日 | |
F | 2019年12月20日 | 2020年1月17日 | |
F | 2019年11月22日 | 2020年12月 | |
G | 2020年7月11日 | 2020||
G | 2020年10月10日 | 2020年11月7日
试试这个:
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
第一查询CCD_ 1计算覆盖my_table
的start_date
和end_date
的月份列表。
第二个查询将my_table
与生成的表"m"
连接起来,以选择其间隔daterange(start_date, end_date)
包含月1日的所有用户(请参阅手册(。
然后,按m.month
对行进行分组,并使用count(DISTINCT user_id)
聚合函数计算每月不同user_id的数量(请参阅手册(。
最后,"m"
0子句允许选择my_table
中没有相应user_id
的月份(请参阅手册(。
请参阅dbfiddle中的测试结果。