【问题标题】:Dynamic LAG function动态 LAG 函数
【发布时间】:2023-03-16 23:57:01
【问题描述】:

我正在尝试获取基于动态滞后函数的值,但我不会得到。 我有一个看起来像这样的表,我想要的是来自序列号的产品的值,它比我当前的序列号高 1

+--------+---------+--------+------------------------+----------+
| Client | Product | Ser_No | Product Ser_No+1 I get | Expected |
+--------+---------+--------+------------------------+----------+
|    1   |    A    |   1    |              B         |     B    |
+--------+---------+--------+------------------------+----------+
|    1   |    B    |   2    |              C         |     C    |
+--------+---------+--------+------------------------+----------+
|    1   |    C    |   3    |              D         |     F    |
+--------+---------+--------+------------------------+----------+
|    1   |    D    |   3    |              E         |     F    |
+--------+---------+--------+------------------------+----------+
|    1   |    E    |   3    |              F         |     F    |
+--------+---------+--------+------------------------+----------+
|    1   |    F    |   4    |              null      |    null  |
+--------+---------+--------+------------------------+----------+
|    2   |    D    |   1    |              E         |     E    |
+--------+---------+--------+------------------------+----------+
|    2   |    E    |   2    |              F         |     G    |
+--------+---------+--------+------------------------+----------+
|    2   |    F    |   2    |              G         |     G    |
+--------+---------+--------+------------------------+----------+
|    2   |    G    |   3    |              H         |     H    |
+--------+---------+--------+------------------------+----------+ 
|    2   |    H    |   4    |              I         |     I    |
+--------+---------+--------+------------------------+----------+
|    2   |    I    |   5    |              null      |     null |
+--------+---------+--------+------------------------+----------+

我唯一能想到的是 Lag(product, 1),但这并不是我现在想要的。有什么想法吗?

这就是我现在所做的:

LEAD(Product, 1) OVER(PARTITION BY Cliënt ORDER BY Ser_No ASC)

但问题是第 3、4 和 8 行。这是我需要的产品代码不是来自下一行,而是来自下一个 Ser_No

【问题讨论】:

  • 您的over() 子句部分在您的问题中可疑地缺失。应该是lag(product,1) over (partition by product order by ser_no asc)。那是你做的吗?
  • 我将问题编辑得更具体

标签: tsql lag rank


【解决方案1】:

我可能会在这里使用lead 而不是lag

SELECT  Client,
        Product,
        Ser_No,
        LEAD(Product) OVER(PARTITION BY Client ORDER BY Ser_No) As [Product Ser_No+1]
FROM TableName

要使用Lag,您需要order by Ser_No desc

有了这个新的编辑,我会这样做:

WITH CTE AS
(
    SELECT  Client,
            Product,
            Ser_No,
            DENSE_RANK() OVER(PARTITION BY Client ORDER BY Ser_No) As rnk
    FROM TableName
)


SELECT  Client,
        Product,
        Ser_No,
        (
            SELECT Product 
            FROM CTE t1 
            WHERE t1.Client = t0.Client 
            AND t1.Rnk = t0.Rnk + 1
        ) As [Product Ser_No+1]
FROM CTE t0

【讨论】:

  • 我打算使用领先功能,我已经编辑了我的问题。因为我遇到的问题是在第 3、4 和 8 行
猜你喜欢
  • 2016-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-11
  • 2016-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多