SQL - 滞后于之前的不同值

问题描述 投票:0回答:1

有没有办法修改

Lag
函数不仅返回上一行,而且返回到之前的不同值?

目前发生的事情:

我想要的:

现在我正在使用

Lag(a1."Job Date", 1) over (partition by a1."Employee Number" Order By a1."Employee Number")
但这返回的是前一行记录而不是前一个不同或不匹配的记录。这是否可能存在滞后或可能有不同的功能?

sql database oracle toad
1个回答
0
投票

这是一个绝妙的技巧。如果您使用“1 PRECEDING”之间的范围,它将从前一个不同值开始窗口。假设您有一些想要分区的键,但如果不是这种情况,您可以删除 PARTITION BY 子句。

小提琴:https://dbfiddle.uk/3tPzIiDN

create table some_test_data
  (
    id integer,
    job_date date
  );

insert into some_test_data values
  (1, date '2023-06-01'),
  (1, date '2023-06-01'),
  (1, date '2023-06-01'),
  (1, date '2023-07-01'),
  (1, date '2023-07-01'),
  (1, date '2023-07-16'),
  (1, date '2023-07-16'),
  (1, date '2023-07-16');

select s.*,
       max(job_date) over (
         partition by id
         order by job_date
         range between unbounded preceding and 1 preceding)
  from some_test_data s;

或者,与相关子查询等效

select t1.*,
       ( select max(t2.job_date)
           from some_test_data t2
          where t1.id = t2.id
            and t1.job_date > t2.job_date
       ) as last_distinct_job_date
  from some_test_data t1;
身份证 作业_日期 LAST_DISTINCT_JOB_DATE
1 23 年 6 月 1 日
1 23 年 6 月 1 日
1 23 年 6 月 1 日
1 23 年 7 月 1 日 23 年 6 月 1 日
1 23 年 7 月 1 日 23 年 6 月 1 日
1 23 年 7 月 16 日 23 年 7 月 1 日
1 23 年 7 月 16 日 23 年 7 月 1 日
1 23 年 7 月 16 日 23 年 7 月 1 日
© www.soinside.com 2019 - 2024. All rights reserved.