我无法使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
答案 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