SQL按时间顺序识别变化

时间:2017-04-05 18:25:21

标签: sql oracle

我真的可以使用SQL的一些帮助

我有一个表,每天为每个用户添加一行

UID DATE       ATTRIBUTE
123 2017-01-01 Awesome
123 2017-01-02 Awesome
123 2017-01-03 Awesome
123 2017-01-04 Not Awesome
123 2017-01-05 Awesome
123 2017-01-06 Awesome
123 2017-01-07 Awesome
166 2017-01-01 Kinda Awesome
166 2017-01-02 Awesome
166 2017-01-03 Awesome
166 2017-01-04 Really Awesome
166 2017-01-05 Awesome
166 2017-01-06 Awesome
166 2017-01-07 Awesome

我想编写一个SQL查询,它允许我识别属性为任何用户更改的日期,用户的上一个属性以及用户的新属性。

我真的不知道从哪里开始。

2 个答案:

答案 0 :(得分:0)

您可以使用窗口函数lag来检查当前行值是否与最后一行函数匹配:

select *
from (
    select t.*,
        case 
            when attribute <> lag(attribute, 1, attribute) over (
                    partition by uid_ order by date_
                    )
                then 1
            else 0
            end as flag
    from your_table t
    ) t
where flag = 1;

Demo

请尽量不要使用UID,DATE等保留关键字作为标识符(我已在解决方案中为它们添加了下划线_)。

答案 1 :(得分:0)

select
  *
from
(
  select
    u.uid,
    u.attribute,
    u.date,
    lag(u.attribute)
      over (partition by u.uid order by u.date) as prev_attribute,
    lag(u.date)
      over (partition by u.uid order by u.date) as prev_date
  from users u
) t
where t.attribute <> t.prev_attribute