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 LAGLEAD 函数可以帮助你实现相同的目的。

请检查以下查询。

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,因为您有平局。所以下一个其实是同一天

SQL DEMO

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;

这应该是最简单高效的方法了。