相关行组上的 Oracle LAG
Oracle LAG on groups of related rows
鉴于此数据:
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
我错过了什么?
根据您实际想要的结果,它可能是您需要的 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
鉴于此数据:
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
我错过了什么?
根据您实际想要的结果,它可能是您需要的 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