mysql - MySQL 查询以在项目期间将不同的项目 ID 计数为总和
问题描述
我有一个如下所示的数据集:
+------------+----------+-------------+------------+-----------+
| Project_ID | Location | status | Start Date | End Date |
+------------+----------+-------------+------------+-----------+
| 122234 | aaaa | ON HOLD | 1/1/2019 | 1/10/2019 |
| 122235 | aaab | IN PROGRESS | 1/1/2019 | 1/15/2019 |
| 122236 | aaac | ON HOLD | 1/5/2019 | 1/10/2019 |
| 122237 | aaad | IN PROGRESS | 1/8/2019 | 2/1/2019 |
| 122238 | aaae | IN PROGRESS | 1/12/2019 | 2/5/2019 |
| 122239 | aaaf | ON HOLD | 1/5/2019 | 1/15/2019 |
| 122240 | aaag | IN PROGRESS | 1/1/2019 | 1/10/2019 |
+------------+----------+-------------+------------+-----------+
这是一个非常小的数据样本,我有 2020 年的数据。
我需要在开始和结束之间的日期范围内计算每个正在进行的 ProjectID,并进行列调用 IN PROGRESS COUNT。我无法弄清楚如何仅在开始日期和结束日期之间进行计数。
这是经过思考后的查询,看看我是否可以使用它:
SELECT
Project_ID,
Location,
Status,
'Start Date' AS Date_Type,
`Start Date` AS Date,
1 AS Count
FROM
Table
WHERE
Status NOT IN ('COMPLETED')
AND
`Snapshot` = (SELECT MAX(`Snapshot`) FROM Table)
GROUP BY
Project_ID
UNION ALL
SELECT
Project_ID,
Location,
Status,
'End Date' AS Date_Type,
`End Date` AS Date,
-1 AS Count
FROM
Table
WHERE
Status NOT IN ('COMPLETED')
AND
`Snapshot` = (SELECT MAX(`Snapshot`) FROM Table)
GROUP BY
Project_ID
这应该允许我使用 running_sum 来获取活动项目。
解决方案
如果某个状态在日期范围内从进行中变为暂停,则不清楚您想要什么。但这的核心是,如果开始和结束日期在范围内,或者开始日期在范围内,或者结束日期在范围内,或者范围在开始和结束日期之间,那么你就会感兴趣。
所以给定
MariaDB [sandbox]> SELECT * FROM T;
+------------+----------+-------------+------------+------------+
| Project_ID | Location | status | Start_Date | End_Date |
+------------+----------+-------------+------------+------------+
| 122234 | aaaa | ON HOLD | 2019-01-01 | 2019-01-10 |
| 122235 | aaab | IN PROGRESS | 2019-01-01 | 2019-01-15 |
| 122236 | aaac | ON HOLD | 2019-01-05 | 2019-01-10 |
| 122237 | aaad | IN PROGRESS | 2019-01-08 | 2019-02-01 |
| 122238 | aaae | IN PROGRESS | 2019-01-12 | 2019-02-05 |
| 122239 | aaaf | ON HOLD | 2019-01-05 | 2019-01-15 |
| 122240 | aaag | IN PROGRESS | 2019-01-01 | 2019-01-10 |
| 122240 | aaag | on hold | 2019-01-11 | 2019-01-12 |
+------------+----------+-------------+------------+------------+
8 rows in set (0.00 sec)
这可能会
SELECT *
FROM T
WHERE STATUS = 'IN PROGRESS' AND
(
(START_DATE BETWEEN '2019-01-01' AND '2019-01-02') OR
(END_DATE BETWEEN '2019-01-01' AND '2019-01-02') OR
(START_DATE <= '2019-01-01' AND END_DATE >= '2019-01-02')
);
+------------+----------+-------------+------------+------------+
| Project_ID | Location | status | Start_Date | End_Date |
+------------+----------+-------------+------------+------------+
| 122235 | aaab | IN PROGRESS | 2019-01-01 | 2019-01-15 |
| 122240 | aaag | IN PROGRESS | 2019-01-01 | 2019-01-10 |
+------------+----------+-------------+------------+------------+
2 rows in set (0.00 sec)
推荐阅读
- vue.js - Nuxt - 返回根目录时如何保留存储状态(主页)
- java - Windows、Gradle 和 Cucumber 组合在生成报告时抛出 IOException
- excel-formula - 根据 Excel 中的累积和返回列号
- powershell - 检查 ADusers 的属性 export-csv 并包含 null
- c# - 未找到 CredDB.CEF
- javascript - Angular 6 - *ngFor:在 JSON 数据中附加选择选项
- mysql - Sql - 查询以获取表中的记录总数
- python - Python while 循环永远不会结束(在 numworks 计算器上)
- node.js - 添加用户交互教程以响应 webapp
- ignite - 在 ignite 中查找并置数据