【发布时间】:2021-06-15 08:53:22
【问题描述】:
给定一个表records,其中包含id INT、status INT、startDate DATETIME 列以及对每个状态的记录进行计数的请求。您如何计算基于当前日期和时间的更正?
想象表由这些记录组成:
| id | status | startDate |
|---|---|---|
| 1 | 1 | 2021-01-01 00:00:00 <-- In the past |
| 2 | 2 | 2021-05-01 00:00:00 <-- Also in the past |
| 3 | 1 | 2021-08-01 00:00:00 <-- This is currently in the future |
状态实际上取决于日期。当状态等于1且日期为过去时,状态必须转换为2。
因此,由于状态取决于日期,因此仅计算所有行并且按状态分组是不准确的。
要为图表生成数据集,我需要统计所有实际状态,按状态分组。
不起作用的示例
SELECT
COUNT(CASE WHEN status = 1 AND dateStart < CURRENT_DATE() THEN 2 ELSE status END) as count,
status
FROM records
group by status
这提供了以下结果:
| count | status |
|---|---|
| 2 | 1 |
| 1 | 2 |
乍一看这似乎没问题,但它计数不正确,因为分组在列 status 上,所以 CASE WHEN.. 语句几乎被忽略了。
我期待的结果是这样的:
| count | status |
|---|---|
| 1 | 1 |
| 2 | 2 |
由于有两条状态为 1 的记录,但其中一条记录的日期已过去,因此应将其更正为两条。
限制
- 我们无法更改表格或列。
- 我们不能使用子查询,只能在查询的
select、where和group by部分提供列或表达式。 - 我们无法更新表格。
【问题讨论】:
-
当状态等于 1 并且日期是过去时,状态必须转换为 2。 1 和 2 是
status列中的唯一值吗? -
@Akina 为了这个例子,只有这两个状态很重要。然而,还有另外两种状态——比如状态 2——不需要任何更正。