我有一堆日期字段

Started     Completed  Status
----------  ---------- ----------
2000-01-30  2000-01-31 2000-01-31
2000-01-30  2000-02-01 2000-02-01

我需要在Status个月前数到StartedCompleted:

Started Completed  Status
------- ---------  ------
2       1          Jan-2000
.       1          Feb-2000

我已经得到了一些类似的东西

SELECT DATE_TRUNC('month', Status) AS Status,
       SUM(IF(DATE_TRUNC('month', Started) = DATE_TRUNC('month', Status), 1, 0)) AS Started,
       SUM(IF(DATE_TRUNC('month', Completed) = DATE_TRUNC('month', Status), 1, 0)) AS Completed
FROM table
GROUP BY Status

这给了我

Started Completed  Status
------- ---------  ------
1       1          Jan-2000
.       1          Feb-2000

我需要Started岁才能在1月份成为2

推荐答案

您可以将所有状态列表与您的表结合,然后应用您的条件来获取按状态月份列出的开始和完成计数:

SELECT S_Status,
       SUM(CASE WHEN DATE_TRUNC('month', Started) = S_Status THEN 1 ELSE 0 END) AS Started,
       SUM(CASE WHEN DATE_TRUNC('month', Completed) = S_Status THEN 1 ELSE 0 END) AS Completed
FROM mytable t
JOIN (
  SELECT DISTINCT DATE_TRUNC('month', Status) as S_Status
  FROM mytable
) AS s ON DATE_TRUNC('month', Started) = S_Status
       OR DATE_TRUNC('month', Completed) = S_Status
GROUP BY S_Status;

结果:

S_Status    Started Completed
2000-01     2       1
2000-02     0       1

因为我没有duckdb,所以我使用PostgreSQL here进行了测试

Sql相关问答推荐

Select 起始参数和截止参数之间的间隔,包括与期间重叠的参数

如何在PostgreSQL中对第1,1,1,1,2,2,2,2行进行编号

重新组合已排序的日期范围

snowflake/SQL嵌套的JSON对象和数组

将Dense_RANK列为聚合(非解析)函数(&A)

对多个条件的SQL进行排名

如何使用不重复的单个顶级字段(列)向json数组 Select 多行

比较SQL中以逗号分隔的字符串

如何将不同层次的产品组和规格组合到最深一层?

Postgres SQL查询从字符串中获取邮箱地址

仅当 SQL Server 中的表为开时,才在存储过程中使用更改跟踪

如何根据创建日期查找两个表中最接近的记录?

获取上个月和上一年的值

SQL:无重复项的两个聚合函数

如何创建一个递归计数器来查找一个元素有多少父级和子级?

SQL获取两个日期范围之间的计数

在 SQL 中使用循环遍历按时间顺序排列的数据

在给定列中具有特定值的行与 SQL 中的总行数的比率

PostgresQL-根据另一列找到 3 个最低值

SQL 查询以填充单个列中的所有值