SQL显示超前、滞后记录的键

SQL显示超前、滞后记录的键,sql,sql-server,oracle,Sql,Sql Server,Oracle,表中的数据可由SQL表示如下: SELECT T.VERSION_ID T_VERSION_ID ,cast(T.START_DATE As Date) as T_START_DATE ,cast(ISNULL( LEAD (START_DATE) OVER (ORDER BY START_DATE),'9999-12-31') As Date) as CALC_END_DATE_LEAD ,cast

表中的数据可由SQL表示如下:

SELECT T.VERSION_ID T_VERSION_ID
                ,cast(T.START_DATE As Date) as T_START_DATE
                ,cast(ISNULL( LEAD (START_DATE) OVER (ORDER BY START_DATE),'9999-12-31') As Date) as CALC_END_DATE_LEAD
                ,cast(ISNULL( LAG  (START_DATE) OVER (ORDER BY START_DATE),'9999-12-31') As Date) as CALC_END_DATE_LAG
FROM(select 'Vrandom1' as VERSION_ID
            ,cast('22-MAR-2018' As Date) as start_date
            ,'9999-12-31' as end_date
            , 1 as is_approved
    union
    select 'Vrandom2' as VERSION_ID
           ,cast('28-MAR-2018' As Date) as start_date
           ,'9999-12-31' as end_date
           ,1 as is_approved
    union
    select 'Vrandom3' as VERSION_ID
          ,cast('25-MAR-2018' As date) as start_date
          ,'9999-12-31' as end_date
          ,1 as is_approved
    ) as T
输出

T_VERSION_ID  T_START_DATE CALC_END_DATE_LEAD                CALC_END_DATE_LAG

Vrandom1                           22/03/2018                         25/03/2018                                         31/12/9999
Vrandom3                           25/03/2018                         28/03/2018                                         22/03/2018
Vrandom2                           28/03/2018                         31/12/9999                                         25/03/2018
此表用于应用程序内部,其中一条记录的版本为“Vrandom3”。对于处理,我需要根据开始日期查找即时领先和滞后记录的键。i、 e.我需要显示Vrandom2和Vrandom1作为超前和滞后记录的键

应用程序中的预期结果:

T_VERSION_ID  T_START_DATE    CALC_END_DATE_LEAD   CALC_END_DATE_LAG   key_leading   key_lagging

Vrandom3      25/03/2018      28/03/2018           22/03/2018          Vrandom2      Vrandom1

我可以考虑根据开始日期加入内联视图,但有没有更好的方法来实现这一点?

访问同一结果集中上一行的数据,而不使用 使用从SQL Server 2012开始的自联接。LAG提供访问权限 到位于当前行之前的给定物理偏移处的行。 在SELECT语句中使用此分析函数比较 当前行的值位于前一行中

这些函数用于获取前行和后行

链接中的示例:

USE AdventureWorks2012;  
GO  
SELECT BusinessEntityID, YEAR(QuotaDate) AS SalesYear, SalesQuota AS CurrentQuota,   
       LAG(SalesQuota, 1,0) OVER (ORDER BY YEAR(QuotaDate)) AS PreviousQuota  
FROM Sales.SalesPersonQuotaHistory  
WHERE BusinessEntityID = 275 and YEAR(QuotaDate) IN ('2005','2006');  
如何添加:

,LEAD (key_col) OVER (ORDER BY START_DATE),'9999-12-31') As Date) as Key_col_LEAD
,LAG (key_col) OVER (ORDER BY START_DATE),'9999-12-31') As Date) as Key_col_LAG

根据您的选择

这完全没有意义。您试图实现的业务逻辑是什么?标题和查询建议“SQL Server”,标签上写着“和Oracle”。它是哪一个?删除了Oracle标记(因为您的示例使用了在Oracle中无效的
TOP
关键字,并且在没有
FROM
子句的情况下也没有使用
SELECT
)。如果它应该被标记为甲骨文,那么请编辑你的问题,把它放回,并明确说明你为什么要标记它。肖恩,我需要更新落后和领先的记录。这就是为什么我需要显示他们的键。你可以扩展你的答案来解释为什么这能解决OP的问题吗?特别是因为,微软有定期更改文档URL或归档内容的习惯,你的答案在将来可能会变得毫无用处。我已经在我的sql中使用了滞后函数和超前函数。我需要列出滞后记录和领先记录的键。您可以在查询中包括这些键。您已经有两列使用滞后/超前。有什么原因不能添加键列吗?user1443098,我需要基于开始日期的滞后行或前导行的键。你能详细说明一下我是如何做到的吗?谢谢!!!这是我遗漏的部分,我可以使用任何列的超前或滞后。感谢您的帮助。另外,是否可以显示带有第一个和最后一个值的记录键?当我尝试:,FIRST_VALUE(VERSION_ID)OVER(ORDER BY START_DATE)作为fv,LAST_VALUE(VERSION_ID)OVER(ORDER BY START_DATE)作为lv时,我得到的结果是:fv lv Vrandom1 Vrandom1 Vrandom1 Vrandom1 Vrandom3 Vrandom1 Vrandom2 fv看起来和预期的一样,但不确定最后一个_值发生了什么:我预计:所有3个记录的Vrandom2为什么?vrandom2具有最高的开始日期,我认为在开始日期之前,它的顺序应该最少。是的,对于所有3条记录,它应该是最后一个值。但是我得到的是“Vrandom3 Vrandom1 Vrandom2”而不是“Vrandom2 Vrandom2 Vrandom2”。感谢在LAST_值中添加“当前行和无界跟随之间的行”会给出正确的结果:在第一个sql中添加:第一个_值(版本ID)作为fv(按开始日期排序),最后一个_值(版本ID)作为lv(按开始日期排序,当前行和无界跟随之间的行)。由于字符限制,我无法粘贴完整的sql。
,LEAD (key_col) OVER (ORDER BY START_DATE),'9999-12-31') As Date) as Key_col_LEAD
,LAG (key_col) OVER (ORDER BY START_DATE),'9999-12-31') As Date) as Key_col_LAG