SQL多条件CASE WHEN问题[第2部分-逻辑调整]



我有一个问题要跟进我昨天发布的一个问题。今天,需要对逻辑进行更改。SQL多条件CASE WHEN发布

示例数据表在这篇文章的底部。原始代码是围绕以下逻辑编写的:

  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并且没有是信用卡,请使用OLDEST订单日期

这可以通过修改Gordon代码中的CASE WHEN来实现吗?或者它需要的不仅仅是简单的改变。

有问题的原始数据表:

订单日期2021年11月1日[/tr>2021年12月1日[/tr>2021年1月14日[/tr>2021年1月16日//tr>2021年1月18日[/tr>
订单号付款方式
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个人支票
333现金
333现金2021年1月13日
333个人支票
400信用卡2021年1月15日
551信用卡
551现金2021年1月17日
680个人支票

如果我正确地得到了这个逻辑,它就是:

  • 如果信用卡上有订单,请选择最早的订单日期
  • 如果正好有两个订单,并且没有信用卡,请选择最新的订单日期
  • 否则,采用最早的订单日期

您可以使用另一个子查询和窗口函数获得辅助信息:

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;

最新更新