我有一个SQL表,它每周更新用户的状态,即

user_id     date           status
101         2022-04-01     asleep
101         2022-04-08     asleep
101         2022-04-15     awake
102         2022-04-01     awake
102         2022-04-08     asleep
102         2022-04-15     asleep

我需要按用户id将结果范围缩小到只包括status列的值与前一周不同的行;因此,在上面的示例中,我真正想要的只是:

user_id     date           status
101         2022-04-01     asleep
101         2022-04-15     awake
102         2022-04-01     awake
102         2022-04-08     asleep

每周状态相同的中间周并不重要;我只想查看用户的状态与前一周不同的行.

推荐答案

根据某些条件,您可以使用LAG()来查看前一行.然后,过滤就很容易了.

例如,您可以执行以下操作:

select *
from (
  select t.*, lag(status) over(partition by user_id order by date) as prev_status
  from t
) x
where status <> prev_status

Sql相关问答推荐

使用自动增量ID插入失败(无法将值空插入列ID)

Trino/Presto sq:仅当空值位于组中第一个非空值之后时,才用值替换空值

SQL—如何根据2列填写缺失的值

在甲骨文中查找前一个星期一的S日期

按每天的最大值分组

从列中提取子字符串的ORDER BY CASE语句

无法将发票与产品价格相关联

如何将不同层次的产品组和规格组合到最深一层?

组合2个分区表的postgres视图的执行计划正在访问所有分区

如何使用Clickhouse的COUNT聚合返回所有列,但GROUP BY是这些列的子集

仅当 SQL Server 中的表为开时,才在存储过程中使用更改跟踪

SQL 搜索 - 获取最大值日期的奇怪行为

创建具有多个子查询的 SQL 视图

在SQL中实现表格数据透视类型报表

使用ALTER TABLE无法删除列

将有效数字作为 varchar 返回的 SQL 函数

如果 SQL 中不存在数据,如何根据某个 ID 为所有日期添加前一行

在 MS Access 中连接相关记录

PostgreSQL 中的递归树查询

每组跨行曲折?