Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 使用RANK()或DENSE_RANK()按秩获取下一个值_Sql Server_Dense Rank - Fatal编程技术网

Sql server 使用RANK()或DENSE_RANK()按秩获取下一个值

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

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

下面是表(表1)中数据的屏幕截图和我想要的结果。Table1屏幕截图中的最后一个值是从与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”的行位于基表中,但我的最终查询包括其他几个连接,这导致该行被删除。这会引起争议吗?我不确定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,其中包含重现您遇到的问题的示例数据?这将比发布截图更有用。欲了解更多信息,请阅读