0

我无法让 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
4

1 回答 1

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', bu 都具有相同的 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
于 2016-03-18T21:43:59.557 回答