mysql - 通过在 SQL 中的日期范围内无法正常工作进行分组
问题描述
我有一张这样的桌子:
created_date | id | status | completed_date
2019-03-20 | 1 | Open |
2019-03-20 | 2 | Open |
2019-03-19 | 3 | Comp | 2019-03-21
2019-03-21 | 4 | Comp | 2019-03-22
2019-03-22 | 5 | Comp | 2019-03-22
2019-03-18 | 6 | Open |
我想查找之前创建的所有状态为OR的ID
s 的计数,它们是之前创建的,甚至具有状态但它们是在 之后完成的。'2019-03-21'
'Open'
'2019-03-21'
'Comp'
'2019-03-21'
以下是我的查询:
SELECT
CAST(CREATED AS DATE),
COUNT(DISTINCT id)
FROM testtable
WHERE
(CAST(CREATED AS DATE) <= '2019-03-21' AND status = 'Open')
OR (
CAST(CREATED AS DATE) <= '2019-03-21' AND status='Comp'
AND CAST(COMPLETED AS DATE) > '2019-03-21'
)
它给出了正确的结果。即,21 日,有 4 个 ID 被打开。但现在我想要过去 4 天的这些信息。我该如何修改这个查询来做到这一点?
输出应该是:
created_date | count(ID)
2019-03-21 | 4
2019-03-20 | 4
2019-03-19 | 2
2019-03-18 | 1
请帮忙!!
解决方案
这是一个适用于您的示例数据的解决方案。它使用可以在 column 中找到的不同值生成日期列表created_date
,然后LEFT JOIN
将其与 table 一起使用。这些JOIN
条件带有您描述的逻辑。在我看来,您似乎不需要检查status
记录,因为显然,任何具有非NULL
completed_date
状态的记录Comp
。
SELECT
dt.created_date,
COUNT(t.id)
FROM
(SELECT DISTINCT created_date FROM mytable) dt
LEFT JOIN mytable t
ON t.created_date <= dt.created_date
AND (t.completed_date IS NULL OR t.completed_date > dt.created_date)
GROUP BY dt.created_date
DB Fiddle上的这个演示与您的示例数据返回:
| created_date | COUNT(t.id) |
| ------------ | ----------- |
| 2019-03-18 | 1 |
| 2019-03-19 | 2 |
| 2019-03-20 | 4 |
| 2019-03-21 | 4 |
| 2019-03-22 | 3 |
推荐阅读
- java - 单击时未显示微调器选定的项目
- javascript - 我可以使用源映射和捆绑文件来检索原始反应代码吗
- mysql - 组合键作为另一个表的外键,组合键作为主键
- java - 应用程序未将日志保存到特定的附加程序
- mysql - 使用内部联接在 SELECT 中设置别名
- dictionary - 如何使用 foreach 和 IF 语句运行循环以检查输入值在字典中找到
- html - WCAG 2.0 冗余链接
- python - 在本地运行烧瓶与在 AWS Elastic BeanStalk 上运行它 - 一些范围问题?
- php - 将请求发布到被 CORS 策略阻止的 api
- c - 为什么我没有得到连接的字符串?