MySQL查询列值更改的时间戳

Posted

技术标签:

【中文标题】MySQL查询列值更改的时间戳【英文标题】:MySQL query for timestamp of change in column value 【发布时间】:2021-01-06 22:39:00 【问题描述】:

如何查询给定 id 的特定列值更改的日期?下表显示了运行作业以确定oppid 状态的日期。我想跟踪oppid 何时有status = status_1 以显示设置状态的最早日期和状态为 status_1 的日期。

| oppid  |    date   |  status   |
+--------+  ---------+-----------+
| 1000   | 2020-07-01|  status_1 |
| 1000   | 2020-07-02|  status_1 |
| 1000   | 2020-07-03|  status_1 |
| 1000   | 2020-07-04|  status_2 |
| 1000   | 2020-07-07|  status_2 |
| 1000   | 2020-07-15|  status_1 |
| 1000   | 2020-07-16|  status_1 |
| 1001   | 2020-07-10|  status_1 |
| 1001   | 2020-07-11|  status_1 |
| 1000   | 2020-08-01|  status_2 |

希望的结果如下所示:

| oppid  |   status  |  status_set | status_changed |
+--------+  ---------+-------------+----------------+
| 1000   | status_1  |  2020-07-01 |   2020-07-04   |
| 1000   | status_1  |  2020-07-15 |   2020-08-01   |
| 1001   | status_1  |  2020-07-10 |                |
 

【问题讨论】:

您使用的是哪个版本的 mysql 【参考方案1】:

你可以使用窗口函数:

select oppid, status, date as status_set, status_changed
from (select t.*,
             lag(status) over (partition by oppid order by date) as prev_status,
             min(case when status <> 'status_1' then date end) over (partition by oppid order by date desc) as status_changed
      from t
     ) t
where (prev_status is null or prev_status <> status) and
      status = 'status_1';

之前的状态用于过滤查找每次状态变为'status_1'的时候。当状态不是'status_1' 时,min() 用于获取下一个日期。

【讨论】:

以上是关于MySQL查询列值更改的时间戳的主要内容,如果未能解决你的问题,请参考以下文章

MySQL索引查询对特定列值花费很长时间

SQL - MYSQL 一个查询接收不同列值的设置限制

如何将查询结果的整列值存储在MYSQL中?

优化最新时间戳查询mysql

SQL 查询:如何在排名列值中使用时间戳列

mySQL查询昨天的最大时间戳