SQL发出问题时的多条件条件[第2部分-逻辑调整] [英] SQL Multi Conditional CASE WHEN issues [Part 2 - logic adjustments]

查看:25
本文介绍了SQL发出问题时的多条件条件[第2部分-逻辑调整]的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我对昨天发布的一个问题有一个跟进问题。今天,所需的逻辑发生了变化。 SQL Multi Conditional CASE WHEN issues

示例数据表在本帖子的底部。原始代码围绕以下逻辑编写:

  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. 如果Orders=1,则使用Order中的时间戳
  2. 如果订单=2,并且其中一个是信用卡,则使用最旧信用卡订单中的日期。
  3. 如果订单=2且无信用卡,请使用最近的订单日期。
  4. 如果订单&>2及任何订单都是信用卡,请使用最早信用卡订单的日期。
  5. 如果订单&>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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆