我有一个问题要跟进我昨天发布的一个问题。今天,需要对逻辑进行更改。SQL多条件CASE WHEN发布
示例数据表在这篇文章的底部。原始代码是围绕以下逻辑编写的:
- 如果只有一个订单号-返回订单日期
- 如果存在>1个相同的订单号,其中任何一个订单都是用信用卡支付的-返回用信用卡付款的最近订单日期
- 如果存在>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,则使用订单中的时间戳
- 如果订单=2,其中一个是信用卡,则使用最旧信用卡订单的日期
- 如果订单=2且无信用卡订单,请使用最近订单日期
- 如果订单>2和任何是信用卡,使用日期从最旧的信用卡订单
- 如果订单>2并且没有是信用卡,请使用OLDEST订单日期
这可以通过修改Gordon代码中的CASE WHEN来实现吗?或者它需要的不仅仅是简单的改变。
有问题的原始数据表:
订单号 | 付款方式 | 订单日期||
---|---|---|---|
120 | 现金 | 2021年1月 | |
175 | 信用卡 | 2021年2月1日 | |
209 | 现金 | 2021年3月1日 | |
209 | 信用卡 | 2021年4月1日 | |
209 | 个人支票 | 2021年5月1日 | |
209 | 信用卡 | 2021年6月1日 | |
209 | 现金 | 2021年7月1日 | |
209 | 个人支票 | 2021年8月1日 | |
277 | 信用卡 | 2021年9月1日 | |
301 | 现金 | 2021年10月1日 | |
333 | 个人支票 | 2021年11月1日[/tr>||
333 | 现金 | 2021年12月1日[/tr>||
333现金 | 2021年1月13日 | ||
333 | 个人支票 | 2021年1月14日[/tr>||
400 | 信用卡 | 2021年1月15日 | |
551 | 信用卡 | 2021年1月16日//tr>||
551 | 现金 | 2021年1月17日 | |
680 | 个人支票 | 2021年1月18日[/tr>
如果我正确地得到了这个逻辑,它就是:
- 如果信用卡上有订单,请选择最早的订单日期
- 如果正好有两个订单,并且没有信用卡,请选择最新的订单日期
- 否则,采用最早的订单日期
您可以使用另一个子查询和窗口函数获得辅助信息:
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;