SQL发出问题时的多条件条件[第2部分-逻辑调整] [英] SQL Multi Conditional CASE WHEN issues [Part 2 - logic adjustments]
本文介绍了SQL发出问题时的多条件条件[第2部分-逻辑调整]的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我对昨天发布的一个问题有一个跟进问题。今天,所需的逻辑发生了变化。 SQL Multi Conditional CASE WHEN issues
示例数据表在本帖子的底部。原始代码围绕以下逻辑编写:
- 如果只有一个订单号-返回订单日期
- 如果有>;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;
对逻辑中的要求进行了更新,并扩展为以下内容:
- 如果Orders=1,则使用Order中的时间戳
- 如果订单=2,并且其中一个是信用卡,则使用最旧信用卡订单中的日期。
- 如果订单=2且无信用卡,请使用最近的订单日期。
- 如果订单&>2及任何订单都是信用卡,请使用最早信用卡订单的日期。
- 如果订单&>2且没有订单是信用卡,请使用最早的订单日期。
是否可以通过在Gordon的代码中修改大小写来实现这一点?或者它需要的不仅仅是这么简单的改变。
有问题的原始数据表:
订单号 | 付款方式 | 订单日期 |
---|---|---|
120 | 现金 | 2021年01月01日 |
175 | 信用卡 | 2021年01月02日 |
209 | 现金 | 2021年03月01日 |
209 | 信用卡 | 2021年04月01日 |
209 | 个人支票 | 2021年05月01日 |
209 | 信用卡 | 2021年06月01日 |
209 | 现金 | 2021年07月01日 |
209 | 个人支票 | 2021年08月01日 |
277 | 信用卡 | 2021年09月01日 |
301 | 现金 | 2021年1月10日 |
333 | 个人支票 | 2021年1月11日 |
333 | 现金 | 2021年1月12日 |
333 | 现金 | 2021年01月13日 |
333 | 个人支票 | 2021年01月14日 |
400 | 信用卡 | 2021年01月15日 |
551 | 信用卡 | 2021年01月16日 |
551 | 现金 | 2021年01月17日 |
680 | 个人支票 | 2021年01月18日 |
推荐答案
如果我正确理解此逻辑,则为:
- 取最早的订单日期(如果在信用卡上)。
- 如果正好有两个订单并且没有信用卡,则采用最新的订单日期。
- 否则,以最早的订单日期为准。
您可以使用另一个子查询和窗口函数获取辅助信息:
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;
这篇关于SQL发出问题时的多条件条件[第2部分-逻辑调整]的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文