【问题标题】:Grouping by aggregated data按汇总数据分组
【发布时间】:2021-06-15 08:53:22
【问题描述】:

给定一个表records,其中包含id INTstatus INTstartDate 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 的记录,但其中一条记录的日期已过去,因此应将其更正为两条。

限制

  1. 我们无法更改表格或列。
  2. 我们不能使用子查询,只能在查询的selectwheregroup by 部分提供列或表达式。
  3. 我们无法更新表格。

【问题讨论】:

  • 当状态等于 1 并且日期是过去时,状态必须转换为 2。 1 和 2 是 status 列中的唯一值吗?
  • @Akina 为了这个例子,只有这两个状态很重要。然而,还有另外两种状态——比如状态 2——不需要任何更正。

标签: mysql group-by count


【解决方案1】:

您应该使用CASE 表达式来获得正确的status 并按其分组:

SELECT CASE WHEN status = 1 AND startDate < CURRENT_DATE() THEN 2 ELSE status END AS correct_status,
       COUNT(*) AS count
FROM records
GROUP BY correct_status

请参阅demo

【讨论】:

    猜你喜欢
    • 2021-04-14
    • 1970-01-01
    • 2014-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-09
    • 1970-01-01
    • 2020-05-05
    相关资源
    最近更新 更多