簡體   English   中英

SQL Multi Conditional CASE WHEN 問題 [第 2 部分 - 邏輯調整]

[英]SQL Multi Conditional CASE WHEN issues [Part 2 - logic adjustments]

對於我昨天發布的問題,我有一個后續問題。 今天,需要對邏輯進行更改。 SQL 多條件 CASE WHEN 問題

示例數據表在這篇文章的底部。 原始代碼是圍繞以下邏輯編寫的:

  1. 如果只有 1 個訂單號 - 返回訂單日期
  2. 如果有 >1 個相似的訂單號並且其中任何一個訂單是用信用卡支付的 - 返回信用卡支付的最近訂單日期
  3. 如果有 >1 個相似的訂單號並且沒有使用信用卡支付的訂單 - 返回最近的訂單日期。

感謝用戶 Gordon Linoff,他提供了以下完美運行的代碼:

    select o.*
from (select o.*,
             row_number() over (partition by order_number
                                order by (case when payment_method = 'Credit Card' then 1 else 2 end),
                                         order_date desc
                               ) as seqnum
      from orders o
     ) o
where seqnum = 1;

對邏輯中的要求進行了更新,已擴展為以下內容:

  1. 如果訂單 = 1,則使用訂單中的時間戳
  2. 如果訂單 = 2 並且一個是信用卡,則使用最早信用卡訂單的日期。
  3. 如果訂單 = 2 且沒有信用卡,請使用最近的訂單日期。
  4. 如果訂單 > 2 且任何訂單都是信用卡,則使用最早信用卡訂單的日期。
  5. 如果訂單 > 2 且沒有信用卡,請使用最舊的訂單日期。

這可以通過修改 Gordon 代碼中的 CASE WHEN 來實現嗎? 還是它需要的不僅僅是簡單的改變。

有問題的原始數據表:

訂單號 付款方式 訂購日期
120 現金 2021 年 1 月 1 日
175 信用卡 2021 年 1 月 2 日
209 現金 01/03/2021
209 信用卡 2021 年 1 月 4 日
209 私人支票 2021 年 1 月 5 日
209 信用卡 2021 年 1 月 6 日
209 現金 2021 年 1 月 7 日
209 私人支票 2021 年 1 月 8 日
277 信用卡 2021 年 1 月 9 日
301 現金 2021 年 1 月 10 日
333 私人支票 2021 年 1 月 11 日
333 現金 2021 年 1 月 12 日
333 現金 2021 年 1 月 13 日
333 私人支票 2021 年 1 月 14 日
400 信用卡 2021 年 1 月 15 日
551 信用卡 2021 年 1 月 16 日
551 現金 2021 年 1 月 17 日
680 私人支票 2021 年 1 月 18 日

如果我正確理解了這個邏輯,它是:

  • 取最早的訂單日期,如果信用卡上有的話。
  • 如果正好有兩個訂單並且沒有信用卡,則取最新的訂單日期。
  • 否則,取最早的訂單日期。

您可以使用另一個子查詢和 window 函數獲取輔助信息:

select o.*
from (select o.*,
             row_number() over (partition by order_number
                                order by (case when cnt = 2 and num_cc = 0 then order_date end) desc,
                                         order_date asc
                               ) as seqnum
      from (select o.*,
                   count(*) over (partition by order_number) as cnt,
                   sum(case when payment_method = 'Credit Card' then 1 else 0 end) over (partition by order_number) as num_cc
            from orders o
           ) o
     ) o
where seqnum = 1;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM