SQL:查找给定字段连续几天具有不同字符串值的记录

Posted

技术标签:

【中文标题】SQL:查找给定字段连续几天具有不同字符串值的记录【英文标题】:SQL: find records whose given field has different string values in consecutive days 【发布时间】:2020-10-25 03:35:40 【问题描述】:

我有下表,我需要找到同一个人的不同状态的连续两天(天之间没有间隔)。

name    date           status
-------------------------------
John    2020-06-01     submitted
John    2020-06-02     pending
John    2020-06-03     approved
John    2020-06-04     approved
Amy     2020-06-02     pending
Amy     2020-06-03     pending
Amy     2020-06-04     pending
Dan     2020-06-02     submitted
Dan     2020-06-03     approved
Dan     2020-06-04     approved
Mary    2020-06-03     submitted
Mary    2020-06-04     pending

输出应如下所示:

name    date           status
-------------------------------
John    2020-06-01     submitted
John    2020-06-02     pending
John    2020-06-03     approved
Dan     2020-06-02     submitted
Dan     2020-06-03     approved
Mary    2020-06-03     submitted
Mary    2020-06-04     pending

目前我导出了表格并编写了一个 python 代码来做到这一点。但是,我想知道是否可以仅使用 SQL 来实现? (我查看了 SQL: retrieve only the records whose value has changed ,但由于 status 字段是字符串而不是数字,因此无法弄清楚如何使它在我的情况下工作)谢谢!

【问题讨论】:

日期之间有间隔吗? @forpas 没有间隔天 【参考方案1】:

我会根据姓名、连续天数和不同状态自行加入表:

SELECT a.name, a.date, a.status
FROM   mytable a
JOIN   mytable b ON a.name = b.name AND
                    a.date + INTERVAL '1' DAY = b.date AND
                    a.status <> b.status

【讨论】:

【参考方案2】:

使用LAG()LEAD() 窗口函数:

select t.name, t.date, t.status
from (
  select *,
    coalesce(lag(status) over (partition by name order by date), status) prev_status,
    coalesce(lead(status) over (partition by name order by date), status) next_status
  from tablename  
) t
where t.status <> t.prev_status or t.status <> t.next_status
order by t.name, t.date

请参阅demo。 结果:

| name | date       | status    |
| ---- | ---------- | --------- |
| Dan  | 2020-06-02 | submitted |
| Dan  | 2020-06-03 | approved  |
| John | 2020-06-01 | submitted |
| John | 2020-06-02 | pending   |
| John | 2020-06-03 | approved  |
| Mary | 2020-06-03 | submitted |
| Mary | 2020-06-04 | pending   |

【讨论】:

以上是关于SQL:查找给定字段连续几天具有不同字符串值的记录的主要内容,如果未能解决你的问题,请参考以下文章

需要 SQL 在不同的列中查找具有重复值的记录

sql 在MySQL数据库中查找具有非ascii值的记录并修复双重编码错误。接受表和字段名称。

查找具有一个值但没有其他值的 sql 记录

在 SQL Server 中查找给定 12 个月内 6 个月的最高连续期间

需要为每条记录查找具有空值的所有列 - 访问 SQL 或 vba

查找具有已定义结束的连续相同值的行组 (SQL Redshift)