LEAD / LAG不递增/递减

时间:2016-03-18 15:33:53

标签: tsql sql-server-2012 lag window-functions lead

我无法使Lead / Lag函数正确递增/递减并返回正确的值。无论我做什么,它仍然返回当前行。 当p.field3值=' 223344'。

时,我需要显示先前的p.field2值和后续的p.field2值。
BEGIN TRY
    SELECT p.field1, 
           p.field2,
           LEAD( p.field2, 1, 'No Lead') OVER (ORDER BY p.field1) AS 'Lead',
           LAG(  p.field2, 1, 'No Lag' ) OVER (ORDER BY p.field1) AS 'Lag',
           p.field3,
           p.field4
    FROM fieldTable p
    WHERE p.field3 = '223344' 
    ORDER BY p.field1
END TRY
BEGIN CATCH
.....
END CATCH

Example Data in Database
1, 'Mr. Smith', '112233', 'Info1'
2, 'Mr. Jones', '223344', 'Info2'
3, 'Mr. Davis', '334455', 'Info3'

Data Being Returned for both Lag and Lead
2, 'Mr. Jones', 'Mr. Jones', 'Mr. Jones', '223344', 'Info2'

I need 'Mr. Smith' to be returned for Lag and 'Mr. Davis' returned for Lead

1 个答案:

答案 0 :(得分:2)

您的查询输出您所说的内容。您的表格中必须包含的样本数据多于您向我们展示的数据。

表格中有这些数据:

field1      field2      field3  field4
1           Mr. Smith   112233  Info1
2           Mr. Jones   223344  Info2
3           Mr. Davis   334455  Info3

这是您的查询的输出:

field1  field2      Lead    Lag         field3  field4
2       Mr. Jones   No Lead No Lag      223344  Info2

这是预期的。您在WHERE条件中限制了您的集合,只从您的基表中选择了1行。因此,没有LAG或LEAD行,并且都返回给定的默认值。

在您的实际样本表中,我确定您有几行,其中field3 =' 223344',所有具有相同field2值的行?

您需要使用FULL集上的窗口函数,然后限制查询。这可以使用子查询来完成。在这种情况下,我使用了一个公用表表达式,我相信它更容易阅读和测试。

WITH
    BaseQuery AS (
        SELECT p.field1, 
                p.field2,
                LEAD( p.field2, 1, 'No Lead') OVER (ORDER BY p.field1) AS 'Lead',
                LAG(  p.field2, 1, 'No Lag' ) OVER (ORDER BY p.field1) AS 'Lag',
                p.field3,
                p.field4
        FROM fieldTable p
    )

SELECT
    *
FROM
    BaseQuery
WHERE
    field3 = '223344'

这会产生所需的输出:

field1  field2      Lead        Lag         field3  field4
2       Mr. Jones   Mr. Davis   Mr. Smith   223344  Info2
相关问题