Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 在SQL中的某个日期范围内,按无法正常工作分组_Mysql_Sql_Group By - Fatal编程技术网

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           |