有没有办法修改一个Lag函数,使其不仅返回前一行,而且返回到前一个不同的值?

What is currently happening:

 Job Date      Previous Job Date   
-----------    ---------------- 
06/10/2013             -
06/10/2013         06/10/2013
06/10/2013         06/10/2013
07/16/2014         06/10/2013
07/16/2014         07/16/2014
06/07/2015         07/16/2014                   
06/07/2015         06/07/2015
06/07/2015         06/07/2015

What I want:

 Job Date      Previous Job Date   
-----------    ---------------- 
06/10/2013             -
06/10/2013             -
06/10/2013             -
07/16/2014         06/10/2013
07/16/2014         06/10/2013
06/07/2015         07/16/2014                   
06/07/2015         07/16/2014 
06/07/2015         07/16/2014 

现在我用的是

Lag(a1."Job Date", 1) over (partition by a1."Employee Number" Order By a1."Employee Number")

但这将返回先前的ROWS记录,而不是先前的DISTINCT或非匹配记录.这是否可以通过LAG或其他函数来实现?

推荐答案

这是一个巧妙的把戏.如果使用介于"1之前"之间的范围,则窗口从前一个不同的值开始.假设您有一些要分区的键,但如果不是这样,则只需删除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;
ID JOB_DATE LAST_DISTINCT_JOB_DATE
1 01-JUN-23 null
1 01-JUN-23 null
1 01-JUN-23 null
1 01-JUL-23 01-JUN-23
1 01-JUL-23 01-JUN-23
1 16-JUL-23 01-JUL-23
1 16-JUL-23 01-JUL-23
1 16-JUL-23 01-JUL-23

Sql相关问答推荐

BigQuery`喜欢ANY‘和`不喜欢ANY’

SQL Select 最小优先级

SQL到Snowflake-转换嵌套的SELECT(值

在Power Bi中将SQL代码转换为DAX

将伪数据插入Postgres表

如何在 SNOSQL 中执行反连接(或 where 子句过滤)以查找字段不包含另一个表中的值的行?

从每月生成的系列中生成每日汇率

用户定义的标量值函数是否仍然会阻止并行性?

SQL ORACLE - 查找连续天数

如何从一张表中获取值在至少三行相同的记录

SQL Server: 将JSON对象数组转换为表格格式

Postgres数据库维护:基于GROUP BY删除旧记录

REGEXP_SUBSTR使用方法

Snowflake中的动态SQL优化

批量更改WooCommerce中所有产品的税收状态

SQL 按 id 运行总计并受条件限制(在窗口上)

为 sqlite 全文搜索 (fts) 创建触发器时出现虚拟表的不安全使用

以 15 分钟为间隔的使用情况SQL 查询

ACCESS SQL - 有没有办法使用通配符仅 Select 字段的特定部分?

当计数为 0 时显示行