sql - 在 UPDATE 语句中使用 LAG 函数
问题描述
我有下表,我需要相应地更新 [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 的倒数第二行)。
我的想法/尝试:我相信我需要使用 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 语句中?如果是这样,怎么做?还赞赏使用所需规则更新表的其他方法。
解决方案
你可以使用 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
推荐阅读
- python - 如何将通过 tkinter 中的循环创建的 Radiobuttons 值设置为默认值?
- javascript - 将项目推送到嵌套对象数组
- docker-compose - services.networks 不支持的配置选项:“ipam”
- r - 将 VBA 代码翻译成 R 代码的问题
- java - 等待所有 JDA RestActions
- python - Python - 每周、每月、每季度、六个月、每年等获取第一次和最后一次观察
- appstore-approval - Apple 拒绝为慈善机构筹款的应用程序
- java - 如何使用java程序设置系统变量
- nservicebus - 将 NServiceBus Saga 与 ConversationId 相关联
- ios - 如何修复 Mapbox iOS 中未更新的自定义路线步骤