SQL 功能:获取行中的下一个值
SQL Function: Get next value in row
我正在寻找一种 SQL 方法来获取下一行的值。
The data I have looks like:
CURR_STRT_DT CUUR_END_DT product
6/30/2019 9/28/2019 A
6/30/2019 9/28/2019 A
9/29/2019 12/28/2019 B
12/29/2019 3/28/2020 C
3/31/2019 6/29/2019 D
我需要输出为
CURR_STRT_DT CUUR_END_DT product NEXT_SRT_DT NEXT_END_DT
6/30/2019 9/28/2019 A 9/29/2019 12/28/2019
6/30/2019 9/28/2019 A 9/29/2019 12/28/2019
9/29/2019 12/28/2019 B 12/29/2019 3/28/2020
12/29/201 3/28/2020 C 3/31/2019 6/29/2019
3/31/2019 6/29/2019 D null null
我尝试使用 lead 函数、last value 和 rank() 所有函数,但没有使用它。谁能帮我完成上述任务
希望我正确理解了你的问题,MySQL LAG
和 LEAD
函数可以帮助你实现相同的目的。
请检查以下查询。
select CURR_STRT_DT,CUUR_END_DT,product,
Lead(CURR_STRT_DT) OVER (ORDER BY CURR_STRT_DT) NEXT_SRT_DT,
Lead(CUUR_END_DT) OVER (ORDER BY CUUR_END_DT) NEXT_END_DT
from tab_name;
您还可以按产品对数据进行分区。教程我已经发了link,你可以看看
教程: http://www.mysqltutorial.org/mysql-window-functions/mysql-lag-function/
您不能使用 Lead,因为您有平局。所以下一个其实是同一天
WITH cte as (
SELECT *, dense_rank() over (ORDER BY CURR_STRT_DT) as rn
FROM Table1
)
SELECT c1.*,
(SELECT `CURR_STRT_DT` FROM cte c2 WHERE c2.rn = c1.rn + 1 ) as `CURR_STRT_DT`,
(SELECT `CUUR_END_DT` FROM cte c2 WHERE c2.rn = c1.rn + 1 ) as `CUUR_END_DT`
FROM cte c1;
输出
您可以使用 window 定义的 range
选项来执行此操作。对于可变范围非常方便:
SELECT t1.*,
MIN(CURR_STRT_DT) OVER (ORDER BY CURR_STRT_DT
RANGE BETWEEN interval 1 day FOLLOWING AND UNBOUNDED FOLLOWING
) as CURR_END_DT
FROM Table1 t1
ORDER BY CURR_STRT_DT;
这应该是最简单高效的方法了。
我正在寻找一种 SQL 方法来获取下一行的值。
The data I have looks like:
CURR_STRT_DT CUUR_END_DT product
6/30/2019 9/28/2019 A
6/30/2019 9/28/2019 A
9/29/2019 12/28/2019 B
12/29/2019 3/28/2020 C
3/31/2019 6/29/2019 D
我需要输出为
CURR_STRT_DT CUUR_END_DT product NEXT_SRT_DT NEXT_END_DT
6/30/2019 9/28/2019 A 9/29/2019 12/28/2019
6/30/2019 9/28/2019 A 9/29/2019 12/28/2019
9/29/2019 12/28/2019 B 12/29/2019 3/28/2020
12/29/201 3/28/2020 C 3/31/2019 6/29/2019
3/31/2019 6/29/2019 D null null
我尝试使用 lead 函数、last value 和 rank() 所有函数,但没有使用它。谁能帮我完成上述任务
希望我正确理解了你的问题,MySQL LAG
和 LEAD
函数可以帮助你实现相同的目的。
请检查以下查询。
select CURR_STRT_DT,CUUR_END_DT,product,
Lead(CURR_STRT_DT) OVER (ORDER BY CURR_STRT_DT) NEXT_SRT_DT,
Lead(CUUR_END_DT) OVER (ORDER BY CUUR_END_DT) NEXT_END_DT
from tab_name;
您还可以按产品对数据进行分区。教程我已经发了link,你可以看看
教程: http://www.mysqltutorial.org/mysql-window-functions/mysql-lag-function/
您不能使用 Lead,因为您有平局。所以下一个其实是同一天
WITH cte as (
SELECT *, dense_rank() over (ORDER BY CURR_STRT_DT) as rn
FROM Table1
)
SELECT c1.*,
(SELECT `CURR_STRT_DT` FROM cte c2 WHERE c2.rn = c1.rn + 1 ) as `CURR_STRT_DT`,
(SELECT `CUUR_END_DT` FROM cte c2 WHERE c2.rn = c1.rn + 1 ) as `CUUR_END_DT`
FROM cte c1;
输出
您可以使用 window 定义的 range
选项来执行此操作。对于可变范围非常方便:
SELECT t1.*,
MIN(CURR_STRT_DT) OVER (ORDER BY CURR_STRT_DT
RANGE BETWEEN interval 1 day FOLLOWING AND UNBOUNDED FOLLOWING
) as CURR_END_DT
FROM Table1 t1
ORDER BY CURR_STRT_DT;
这应该是最简单高效的方法了。