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 在MySQL数据库中查找具有非ascii值的记录并修复双重编码错误。接受表和字段名称。
在 SQL Server 中查找给定 12 个月内 6 个月的最高连续期间