我试着应用了几个here的解决方案,但我的问题似乎与本文中的OP有些不同.


我在MySQL中有一个大型数据集data:

id          date          val
aaaaa       2021-01-01    TRUE
aaaaa       2021-01-02    FALSE
aaaaa       2021-01-03    FALSE
aaaaa       2021-01-04    TRUE
aaaaa       2021-01-05    FALSE
aaaaa       2021-01-06    TRUE
aaaaa       2021-01-07    FALSE
...
aaaaa       2021-12-31    FALSE
aaaab       2021-01-01    TRUE
aaaab       2021-01-02    FALSE
...
zzzzz       2021-12-31    FALSE

这里,id是字符串类型的数据,date的范围是从2021-01-012021-12-31,没有任何遗漏的天数,val包含布尔值TRUEFALSE.data是按id, date排序的.

我想增加两栏,lagged_date栏和date_diff栏.

  • lagged_date包含id的先前日期,其中val = TRUE.
  • date_diff计算该行中datelagged_date之间的天数之差.

理想情况下,我的最终数据集应该如下所示:

id          date          val        lagged_date     date_diff
aaaaa       2021-01-01    TRUE       NULL            NULL
aaaaa       2021-01-02    FALSE      2021-01-01      1
aaaaa       2021-01-03    FALSE      2021-01-01      2
aaaaa       2021-01-04    TRUE       2021-01-01      3
aaaaa       2021-01-05    FALSE      2021-01-04      1
aaaaa       2021-01-06    TRUE       2021-01-04      2
aaaaa       2021-01-07    FALSE      2021-01-06      1
...
aaaaa       2021-12-31    FALSE      2021-12-25      6
aaaab       2021-01-01    TRUE       NULL            NULL
aaaab       2021-01-02    FALSE      2021-01-01      1
...

(请注意,该数据也是按id, date排序的)

我try 了以下查询:

SELECT *,
       MAX(val) OVER (
          PARTITION BY id, val
          ORDER BY date
          ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING
       ) AS lagged_date,
       DATE_DIFF(date, lagged_date, DAY) AS date_diff
  FROM data

lagged_date并没有产生我想要的输出,只产生了滞后的val.我也试了MAX(date),但没有用.

任何真知灼见都值得赞赏.

推荐答案

使用子查询查找每个‘id’的先前日期,其中为‘true’,然后使用date_diff函数.

SELECT t1.id, t1.date, t1.val,
  (SELECT t2.date FROM data t2 WHERE t2.id = t1.id AND t2.val = TRUE AND t2.date < t1.date ORDER BY t2.date DESC LIMIT 1) as lagged_date,
  DATEDIFF(t1.date, (SELECT t2.date FROM data t2 WHERE t2.id = t1.id AND t2.val = TRUE AND t2.date < t1.date ORDER BY t2.date DESC LIMIT 1)) as date_diff
FROM data t1

Mysql相关问答推荐

MySQL:统计单词在单元格中出现的次数,并将数字放在bra中单词的旁边

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

带有值分隔的MySQL分组不起作用

为什么歌曲详细信息未显示在 Liked.handlebars 视图中?

按特定顺序匹配 EventS 和下一个 EventA 之前的第一个 Event 之间的记录

如何使用等于、喜欢和不等于在 json 字段上编写查询?

状态为已发货的订单返回产品总数量的SQL(不同的两张表)

如何在 axios 请求中将更新的设置状态值作为参数传递

如何在 mysql 的 group by 子句中 Select 最后创建的记录?

如何在不使用子查询的情况下按最小日期计算新用户?

如何从将分钟、天、月和年存储在不同列中的表中查询数据

在 MySQL 中为多列创建索引以进行查询优化

mysql 5.5;可以从记录中排除表吗?

如何在 SQL 的计算列中显示小数点后两位?

MySQL:使用来自查询的信息创建一个新表

在 MySQL 的存储过程中调用存储过程

函数 mysql_real_escape_string 的 PDO 类似功能是什么?

当您无法修复表时,如何修复 MySQL不正确的密钥文件错误?

在 spring-boot jpa hibernate 中 >4<24 后与 Db 的连接终止

加快 mysql 转储和导入