使用 RANK() 或 DENSE_RANK() 按 Rank 获取下一个值

Using RANK() or DENSE_RANK() to get the next value by Rank

我在 SQL 服务器 table 中有数据,其中只有一个日期列。这个日期是我数据库中每个 LocationID 的“转移日期”。我需要编写一个查询,其中一个 CustomerID 的 TransferDate 变为 StopDate。此外,相同的 TransferDate 也成为按日期顺序排列的下一个 CustomerID 的 StartDate。我也许可以使用 RANK() 或 DENSE_RANK 和 OVER 按 LocationID 和 TransfDate 对结果进行排序。我的问题是如何使用 RANK() 或任何其他方法在我的 table 中获取“下一个”TransferDate 作为下一个 CustomerID 的 StartDate。

这里是table(表1)中数据的截图和我想要的结果。 Table1 屏幕截图中的最后一个值是从相关 table 到 Table1 的派生值,我正在为其使用连接来获取该额外的行。

LocationID  CustomerID  TransferDate
------------------------------------
500007      109160      12/29/2009
500007      109160      2/9/2018
500007      99999999    2/13/2018
500007      100001      3/30/2018
500007      129615      4/8/2019
500007      100001      5/16/2019
500007      99999999    5/17/2019
500007      131458      12/31/9999

使用 LEAD() 和 LAG() 后的结果:

工作 DDL 如下。客户 '111706' 的一行位于基础 table 中,但我的最终查询包括其他几个连接,导致该行被删除。这会引起问题吗?我不确定 LEAD() 或 LAG() 何时实际执行。我觉得它们在我加入之前执行,导致数据集的其余部分有问题。

create table Table1(
  Location char(15),
  Customer varchar(15),
  TransferDate datetime
  )
  
  insert into Table1 
  values
  ('500007','111706','2009-12-29'),
  ('500007','109160','2009-12-29'),
  ('500007','109160','2018-02-09'),
  ('500007','VACANT','2018-02-13'),
  ('500007','100001','2018-03-30'),
  ('500007','129615','2019-04-08'),
  ('500007','100001','2019-05-16'),
  ('500007','VACANT','2019-05-17');
  
select Location, Customer, TransferDate,
LAG(TransferDate,1,TransferDate) over (order by Location,TransferDate) as StartDate,
LEAD(TransferDate,1) over (order by Location,TransferDate) as StopDate
from Table1
where Location='500007'`

我能够使用@GarethD 的建议来解决我的问题。就我而言,LAG() 是答案,因为我已经有了下一个可用日期。感谢他对此的帮助。我找到了一些 good examples here.