Sql server 使用RANK()或DENSE_RANK()按秩获取下一个值
我在SQL Server表中有数据,其中只有一个日期列。此日期是数据库中每个LocationID的“传输日期”。我需要编写一个查询,其中一个CustomerID的TransferDate成为StopDate。此外,相同的TransferDate也将按日期顺序成为下一个CustomerID的起始日期。我也许可以使用RANK()或densite_RANK和OVER按LocationID和TransfDate对结果进行排序。我的问题是如何使用RANK()或任何其他方法获取表中的“下一个”TransferDate作为下一个CustomerID的起始日期 下面是表(表1)中数据的屏幕截图和我想要的结果。Table1屏幕截图中的最后一个值是从与Table1相关的表中派生出来的值,我正在使用联接获取该表的另一行Sql server 使用RANK()或DENSE_RANK()按秩获取下一个值,sql-server,dense-rank,Sql Server,Dense Rank,我在SQL Server表中有数据,其中只有一个日期列。此日期是数据库中每个LocationID的“传输日期”。我需要编写一个查询,其中一个CustomerID的TransferDate成为StopDate。此外,相同的TransferDate也将按日期顺序成为下一个CustomerID的起始日期。我也许可以使用RANK()或densite_RANK和OVER按LocationID和TransfDate对结果进行排序。我的问题是如何使用RANK()或任何其他方法获取表中的“下一个”Transfe
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”的行位于基表中,但我的最终查询包括其他几个连接,这导致该行被删除。这会引起争议吗?我不确定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()是答案,因为我已经有了下一个日期。谢谢他的帮助。我找到了一些。我能够利用@GarethD的建议来解决我的问题。在我的例子中,LAG()是答案,因为我已经有了下一个日期。谢谢他的帮助。我找到了一些。听起来像是您想要的,而不是
RANK()
或densed\u RANK()
请发布SQL Server的实际版本。SELECT@@VERSION
返回什么?@GarethD是的,我确实需要使用LEAD()。我不知道。仍在试图找出如何抑制最后一条记录中的空值。@Nick.McDermaid我正在使用SQL Server 2012。您能否发布一个小的工作DDL,其中包含重现您遇到的问题的示例数据?这将比发布截图更有用。有关详细信息,请阅读,它听起来像是您想要的,而不是RANK()
或densite\u RANK()
请发布SQL Server的实际版本。SELECT@@VERSION
返回什么?@GarethD是的,我确实需要使用LEAD()。我不知道。仍在试图找出如何抑制最后一条记录中的空值。@Nick.McDermaid我正在使用SQL Server 2012。您能否发布一个小的工作DDL,其中包含重现您遇到的问题的示例数据?这将比发布截图更有用。欲了解更多信息,请阅读