SQL显示超前、滞后记录的键
表中的数据可由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
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