首页 > 解决方案 > 仅更新所有列值组合的自定义优先级最高的行

问题描述

我在下面有一个表(输入表),需要根据 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'

标签: sqlsql-servertsql

解决方案


您可以使用分析函数,如下所示:

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,则为迟到,否则不是。


推荐阅读