使用 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.
我在 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.