首页 > 解决方案 > 在 UPDATE 语句中使用 LAG 函数

问题描述

我有下表,我需要相应地更新 [QuotaReached] 列:

[销售表]
1

对于 SalesTable,我需要应用此规则(将编写为伪代码):IF Staff_Id_Sales > 3000 AND QuotaReached for PREVIOUS [date] = 1 THEN 2。

说明:最后一行的 Staff_Id 5 的 QuotaReached = 2,因为:

a) 最后一行日期的销售额 > 3000。

b) Staff_Id 5 的前一行的 QuotaReached = 1。因此,“前一行”是指具有最近的前一个日期的行(即包含日期 2002-25-04 的倒数第二行)。

我的想法/尝试:我相信我需要使用 LAG() 函数,但是当我尝试在 CASE WHEN 语句中抛出 LAG() 函数时,它会失败(因为它是一个窗口函数,需要选择或排序条款)。

我需要应用比这更多的业务规则,所以我相信它必须在 CASE when 语句中,如下所示:

UPDATE SalesTable 
SET QuotaReached = (CASE WHEN Staff_Id_Sales < 5000 AND ClosedSale = 0 THEN 0
WHEN Staff_Id_Sales > 5000 AND ClosedSale = 1 OR ClosedSale THEN 3
WHEN Staff_Id_Sales < 5000 AND ClosedSale = 1 THEN 1
WHEN [a bunch of other rules apply here]
WHEN Staff_Id_Sales > 3000 AND QuotaReached for PREVIOUS [date] = 1 THEN 2. <-- the ONLY business rule,
which I need help with applying inside this update statement.

是否可以将其与其他规则一起应用到我的 UPDATE 语句中?如果是这样,怎么做?还赞赏使用所需规则更新表的其他方法。

标签: sqlsql-servertsqlsql-update

解决方案


你可以使用 cte :

;with cte as (
SELECT
    STAFF_ID -- or whatever the primary key is 
    , LAG(QuotaReached) OVER (partition by STAFF_ID ORDER by [date]) as Previous_QuotaReached
FROM SalesTable
)

UPDATE s 
SET QuotaReached = CASE ...
WHEN Staff_Id_Sales > 3000 AND c.Previous_QuotaReached = 1 THEN 2
FROM SalesTable s
JOIN cte c
 ON s.STAFF_ID = c.STAFF_ID

推荐阅读