sql - 仅更新所有列值组合的自定义优先级最高的行
问题描述
我在下面有一个表(输入表),需要根据 orderid 、 MercerId 和 uniqueId 的所有组合的状态优先级将 is_latest 更新为 true 优先级是:
RETURNED - 1
CANCELLED - 2
SHIPPED - 3
ORDDERED - 4
输入
OrderId |MerchantId | uniqueId | status | is_latest
O1 M1 U1 ORDERED F
O2 M2 U2 ORDERED F
O1 M1 U1 SHIPPED F
O2 M2 U2 SHIPPED F
O2 M2 U2 CANCELLED F
O3 M3 U3 ORDERED F
结果应该是:
OrderId |MerchantId | uniqueId | status | is_latest
O1 M1 U1 ORDERED F
O2 M2 U2 ORDERED F
O1 M1 U1 SHIPPED T
O2 M2 U2 SHIPPED F
O2 M2 U2 CANCELLED T
O3 M3 U3 ORDERED T
我看到了几个例子,但没有一个是用于更新所有列组合
提前致谢
----------我尝试使用以下查询 ------------
WITH cte2 AS
(
SELECT OrderId , merchantId , uniqueId,
ROW_NUMBER() OVER (PARTITION BY OrderId , merchantId , iniqueId ORDER BY
CASE order_status
WHEN 'ORDERED' THEN 4
WHEN 'SHIPPED' THEN 3
WHEN 'CANCELLED' THEN 2
WHEN 'RETURNED' THEN 1
ELSE 5
END
) AS rn
FROM table1
)
Update rdyip
SET rdyip.is_latest = 'T'
FROM table rdyip
inner JOIN
cte2
on
rdyip.OrderId = cte2.OrderId and
rdyip.MerchantId = cte2.MerchantId and
rdyip.uniqueId = cte2.uniqueId
where cte2.rn=1
它将所有行更新为 is_latest= 'T'
解决方案
您可以使用分析函数,如下所示:
SELECT
a.OrderId
,a.MerchantId
,a.uniqueId
,a.status
,IIF(ROW_NUMBER() OVER (PARTITION BY a.OrderId, a.MerchantId, a.uniqueId ORDER BY n.ordinal) = 1, 'T', 'F')
FROM (VALUES
('O1', 'M1', 'U1', 'ORDERED', 'F')
, ('O2', 'M2', 'U2', 'ORDERED', 'F')
, ('O1', 'M1', 'U1', 'SHIPPED', 'F')
, ('O2', 'M2', 'U2', 'SHIPPED', 'F')
, ('O2', 'M2', 'U2', 'CANCELLED', 'F')
, ('O3', 'M3', 'U3', 'ORDERED', 'F')
) a (OrderId, MerchantId, uniqueId, status, is_latest)
INNER JOIN (VALUES
('RETURNED', 1)
, ('CANCELLED', 2)
, ('SHIPPED', 3)
, ('ORDERED', 4)
) n (status, ordinal)
ON n.status = a.status
我只是加入可能的状态以获得每个状态的序数值,然后我使用 ROW_NUMBER 在每个唯一组合中按序数对行进行排序。
最小的序号将是第 1 行,因此如果 row_number 为 1,则为迟到,否则不是。
推荐阅读
- java - Orika 映射器,当其中一个属性是一个枚举时,这两个类具有不同的支持值
- mysql - 为什么来自 python 的 MySQL 调用会报告 SQL 错误?
- android - 在 sharedPref.getString 中有一个默认值有什么意义?
- python - 如何遍历返回二维数组的第三个数组维度
- c# - 如何将 SAML 身份验证添加到 MVC 应用程序
- c - 没有创建链接列表,为什么?[CS50 pset4]
- python - Nvidia Jetson Xavier Hello AI World,运行示例时出错
- typescript - 虚拟函数导致“错误 TS1109:预期表达式”。
- javascript - 控制台错误,需要删除特定字符
- groovy - Groovy RestClient POST 请求发送无效的 JSON