相关行组上的 Oracle LAG

Posted

技术标签:

【中文标题】相关行组上的 Oracle LAG【英文标题】:Oracle LAG on groups of related rows 【发布时间】:2017-01-18 14:54:56 【问题描述】:

鉴于此数据:

LINE DATE
1   08/19/2016
2   08/19/2016
3   08/19/2016
1   07/29/2016
2   07/29/2016
1   06/24/2012
2   06/24/2012
3   06/24/2012

我想生成:

LINE DATE PRIOR_DATE
1   08/19/2016  07/29/2016
2   08/19/2016  07/29/2016
3   08/19/2016  07/29/2016
1   07/29/2016  06/24/2016
2   07/29/2016  06/24/2016
1   06/24/2012  <NULL>
2   06/24/2012  <NULL>
3   06/24/2012  <NULL>

这个查询:

SELECT line, date,LAG(date, 1) OVER (partition by date ORDER BY date) AS prior_date ...

生成:

1   08/19/2016  
2   08/19/2016  08/19/2016
3   08/19/2016  08/19/2016
1   07/29/2016  
2   07/29/2016  07/29/2016
1   06/24/2012  
2   06/24/2012  06/24/2012
3   06/24/2012  06/24/2012

我错过了什么?

【问题讨论】:

您可能需要另一个字段来指示顺序,记住 db set arent order。 另外你需要解释一下逻辑,起初看起来partition by LINE应该解决它,但不确定你是如何在结果中得到这个3 08/19/2016 07/29/2016的,第3行没有07/29/2016跨度> 为什么您期望 07/29/2016 行 = 3 和日期 = 08/19/2016 行?该行的上一个日期肯定是 2012 年 6 月 24 日吗?我最初的想法是您在LAG(dt) OVER (PARTITION BY line ORDER BY dt) 之后(使用“dt”而不是“date”作为列名,因为“date”是保留字)但这与您所追求的结果也不匹配。 【参考方案1】:

根据您实际追求的结果,它可能是您需要的 LAST_VALUE() 或 LAG()。

我在这里给出了两者,所以你可以看到不同之处:

WITH sample_data AS (SELECT 1 line, to_date('08/19/2016', 'mm/dd/yyyy') dt FROM dual UNION ALL
                     SELECT 2 line, to_date('08/19/2016', 'mm/dd/yyyy') dt FROM dual UNION ALL
                     SELECT 3 line, to_date('08/19/2016', 'mm/dd/yyyy') dt FROM dual UNION ALL
                     SELECT 1 line, to_date('07/29/2016', 'mm/dd/yyyy') dt FROM dual UNION ALL
                     SELECT 2 line, to_date('07/29/2016', 'mm/dd/yyyy') dt FROM dual UNION ALL
                     SELECT 1 line, to_date('06/24/2012', 'mm/dd/yyyy') dt FROM dual UNION ALL
                     SELECT 2 line, to_date('06/24/2012', 'mm/dd/yyyy') dt FROM dual UNION ALL
                     SELECT 3 line, to_date('06/24/2012', 'mm/dd/yyyy') dt FROM dual)
-- end of mimicking a table with data in it
SELECT line,
       dt,
       last_value(dt) OVER (ORDER BY dt RANGE BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING) prior_dt1,
       LAG(dt) OVER (PARTITION BY line ORDER BY dt) prior_dt2
FROM   sample_data
ORDER BY dt DESC, line;

      LINE DT          PRIOR_DT1   PRIOR_DT2
---------- ----------- ----------- -----------
         1 19/08/2016  29/07/2016  29/07/2016
         2 19/08/2016  29/07/2016  29/07/2016
         3 19/08/2016  29/07/2016  24/06/2012
         1 29/07/2016  24/06/2012  24/06/2012
         2 29/07/2016  24/06/2012  24/06/2012
         1 24/06/2012              
         2 24/06/2012              
         3 24/06/2012                        

【讨论】:

last_value 是我所需要的。

以上是关于相关行组上的 Oracle LAG的主要内容,如果未能解决你的问题,请参考以下文章

oracle lag与lead分析函数简介

ORACLE 偏移分析函数 lag()与lead() 用法

ORACLE 偏移分析函数 lag()与lead() 用法

python使用statsmodels包中的tsa.acf函数指定nlags参数计算指定滞后位置个数(级别)时间序列数据自相关性(autocorrelation for specific lag)

python使用statsmodels包中的tsa.acf函数计算时间序列数据所有滞后位置个数(级别)的自相关性(autocorrelation for every lag)

Oracle SQL - 过滤掉包含具有特定值的行的分区或行组