在 UPDATE 语句中使用 LAG 函数

Using LAG function inside UPDATE statement

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

[销售表]

对于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).

我的 thoughts/attempts:我相信我需要使用 LAG() 函数,但是当我尝试在 CASE WHEN 语句中抛出 LAG() 函数时,它失败了(因为它是一个窗口函数,这需要 select 或按子句排序)。

我需要应用比这更多的业务规则,所以我相信它必须在 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 语句中?如果是这样,如何?使用所需规则更新 table 的其他方法也值得赞赏。

你可以使用 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