【问题标题】:LEAD/LAG Not Incrementing/DecrementingLEAD/LAG 不递增/递减
【发布时间】:2016-07-05 10:41:29
【问题描述】:

我无法让 Lead/Lag 函数正确地递增/递减并返回正确的值。无论我做什么,它仍然返回当前行。 当 p.field3 value = '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 '旋转' '23456' 1 2 '旋转' '12345' 1
  • 由于某种原因,当我在第二行后按 Enter 时,它发布了我的回复。为 Lead 返回第一个值“23456”,而它应该是“12345”。 Lag 也是如此。它还返回当前记录/行。我以多种方式重写了代码,使用了 ORDER BY 和 PARTITION 的所有可能组合。我可以从多个站点剪切和粘贴示例并且它们可以工作,但是数据是简单的数字示例,没有“=”到 WHERE 子句。我认为“等于”会阻止显示下一条或上一条记录。
  • @polczym:更新您问题中的示例数据。不在此发表评论。
  • 为问题添加详细信息。

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


【解决方案1】:

您的查询确实输出您所说的内容。您的表格中的示例数据必须比您向我们显示的要多。

在表格中有这个数据:

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

【讨论】:

  • 你是 100% 正确的。有更多的数据,你的假设是正确的。我没有退回全套。干得好 - 感谢您分析此问题并解决了我的问题。
猜你喜欢
  • 1970-01-01
  • 2013-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-19
  • 1970-01-01
  • 1970-01-01
  • 2021-02-03
相关资源
最近更新 更多