相关行组上的 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的主要内容,如果未能解决你的问题,请参考以下文章
python使用statsmodels包中的tsa.acf函数指定nlags参数计算指定滞后位置个数(级别)时间序列数据自相关性(autocorrelation for specific lag)
python使用statsmodels包中的tsa.acf函数计算时间序列数据所有滞后位置个数(级别)的自相关性(autocorrelation for every lag)