Name Date Hours Count
Mills 2022-07-17 23 12
Mills 2022-07-18 00 15
Mills 2022-07-18 01 20
Mills 2022-07-18 02 22
Mills 2022-07-18 03 25
Mills 2022-07-18 04 20
Mills 2022-07-18 05 22
Mills 2022-07-18 06 25
MIKE 2022-07-18 00 15
MIKE 2022-07-18 01 20
MIKE 2022-07-18 02 22
MIKE 2022-07-18 03 25
MIKE 2022-07-18 04 20

我当前的输入表存储了一天中每小时连续记录的计数信息.我需要提取连续计数的值差,但由于我被迫使用MySQL 5.7,所以我很难做到这一点.

我已将查询编写如下:

SET @cnt := 0;
SELECT Name, Date, Hours, Count, (@cnt := @cnt - Count) AS DiffCount
FROM Hourly
ORDER BY Date;

这并没有给出确切的结果.

我希望有以下输出:

Name Date Hours Count Diff
Mills 2022-07-17 23 12 0
Mills 2022-07-18 00 15 3
Mills 2022-07-18 01 20 5
Mills 2022-07-18 02 22 2
Mills 2022-07-18 03 25 3
Mills 2022-07-18 04 20 5
Mills 2022-07-18 05 22 2
Mills 2022-07-18 06 25 3
MIKE 2022-07-18 00 15 0
MIKE 2022-07-18 01 20 5
MIKE 2022-07-18 02 22 2
MIKE 2022-07-18 03 25 3
MIKE 2022-07-18 04 20 5
MIKE 2022-07-18 05 22 2
MIKE 2022-07-18 06 25 3

请指出我遗漏了什么.

推荐答案

MySQL 5.7中,可以内联更新变量,以包含更新后的值"Count".因为当"Name"的值发生变化时,需要重置变量,所以可以使用另一个包含先前"Name"值的变量.然后使用IF函数判断:

  • 如果您以前的名字等于您现在的名字
  • 然后计算计数差异
  • else分配0

它将与ABS函数相结合,该函数将绝对值应用于差值.

SET @cnt  := NULL;
SET @name := NULL;

SELECT Date,
       Hours,
       ABS(IF(@name = Name, 
              @cnt := @cnt - Count,
              0)                    ) AS DiffCount,
       (@name := Name)                AS Name,
       (@cnt := Count)                AS Count
FROM tab
ORDER BY Name DESC,
         Date, 
         Hours;

判断演示here.


MySQL 8.0中,您可以使用像LAG这样的窗口函数来平滑地获得输出.它将结合:

  • ABS,将绝对值应用于差值,
  • COALESCE用于删除第一个空值.
SELECT *, 
       COALESCE(ABS(
           Count - LAG(Count) OVER(
                       PARTITION BY Name
                       ORDER     BY Date, Hours
                   )
       ), 0) AS Diff 
FROM tab
ORDER BY Name DESC, 
         Date, 
         Hours

判断演示here.

Mysql相关问答推荐

可以在MySQL表名中使用表情包吗?

在MySQL中存储一条帖子的点赞数量

MySQL::JSON列的添加使SELECT查询非性能(当需要临时表时)

如何更新一个巨大的表的 50k 行?

将 Cloud Function (nodejs) 连接到 CloudSQL mySQL 数据库

在 MySQL 中跨日期和位置计算和排序实体的共现

检索按键列值分组的最新日期 (MySql)

SQL 根据多行值获取记录

巨大的未分区 MySQL 表问题

在 MySQL 中转换 JSON 数组值

Select 多列但仅按 1 列分组

MySql查询无结果

Ansible 幂等 MySQL 安装 Playbook

MySQL - 如何在 INSERT 语句中将字符串值解析为 DATETIME 格式?

MySQL INSERT IF(自定义 if 语句)

MySQL嵌套 Select 查询?

如何存储重复日期牢记夏令时

Sequelize Query 查找日期范围内的所有记录

MYSQL_ROOT_PASSWORD 已设置但在 docker 容器中获取用户'root'@'localhost'的访问被拒绝(使用密码:YES)

MySQL 更新连接表