在 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
我有以下 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