Mysql 在SQL中的某个日期范围内,按无法正常工作分组
我有一张这样的桌子:Mysql 在SQL中的某个日期范围内,按无法正常工作分组,mysql,sql,group-by,Mysql,Sql,Group By,我有一张这样的桌子: 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-1
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 |
我想找到在'2019-03-21'
之前创建的、状态为'Open'
或在'2019-03-21'
之前创建的、甚至状态为'Comp'
但在'2019-03-21'
之后完成的所有ID
的计数
以下是我的疑问:
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'
)
请帮忙 这里有一个可以正确处理示例数据的解决方案。它使用可在列
created\u date
中找到的不同值生成日期列表,然后将其与表左连接。JOIN
条件包含您描述的逻辑。在我看来,您似乎不需要检查记录的状态
,因为,显然,任何具有非空
完成日期
的记录都处于状态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
下面是一个可以正确处理示例数据的解决方案。它使用可在列created\u date
中找到的不同值生成日期列表,然后将其与表左连接。JOIN
条件包含您描述的逻辑。在我看来,您似乎不需要检查记录的状态
,因为,显然,任何具有非空
完成日期
的记录都处于状态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
示例结果的总计为11,但原始数据中只有六行。我不明白。您的示例结果总计为11行,但原始数据中只有6行。我不明白。
| 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 |