【问题标题】:return 1 when multiple conditions meet多个条件满足返回1
【发布时间】:2022-12-10 18:01:56
【问题描述】:

我有一个看起来像这样的表:

ACCOUNT       hour_count
A             24
B             24
C             23
D             22

我想创建一个 sql 语句,当所有条件都满足时只返回“1”:

when account is A, hour_count = 24
when account is B, hour_count = 24
when account is C, hour_count > 22
when account is D, hour_count > 22

我怎样才能做到这一点?

我尝试使用 CASE 语句,但我做不到 if 弄清楚如何包含多个条件。它不适用于单个 WHEN 语句中的 AND:

SELECT
CASE
    WHEN ((ACCOUNT = 'A' AND hour_count = 24) )
    THEN 1
END
FROM hour_counts

【问题讨论】:

  • 满足其中一个条件还是全部满足需要返回1?
  • 当大家见面的时候。 @JHH
  • 它应该那样工作。你的错误是什么?
  • 如果一个或多个帐户(A、B、C、D)丢失但可用的帐户满足条件怎么办?
  • @Rajat 我猜它们的值是未知的(NULL),而 NULL 是关系代数中的吸收元素

标签: sql snowflake-cloud-data-platform case window-functions snowflake-schema


【解决方案1】:

您可以将每个检查变成 where 子句中的存在谓词:

(可选样本测试数据):

create or replace table T1 as 
select 
COLUMN1::string as "ACCOUNT",
COLUMN2::string as "HOUR_COUNT"
from (values
('A','24'),
('B','24'),
('C','23'),
('D','22')
);

为每个检查查询 exists 谓词:

select 1 as CHECKS where
exists (select 1 from T1 where ACCOUNT = 'A' and HOUR_COUNT = 24) and
exists (select 1 from T1 where ACCOUNT = 'B' and HOUR_COUNT = 24) and
exists (select 1 from T1 where ACCOUNT = 'C' and HOUR_COUNT > 22) and
exists (select 1 from T1 where ACCOUNT = 'D' and HOUR_COUNT > 22)
;

请注意,对于测试数据,这不会返回一行。那是因为它对帐户 D 的检查失败。您可以将检查更改为 >= 或更改 D 的值以查看通过存在检查的效果。

【讨论】:

    【解决方案2】:

    如果你只返回一个 1 如果所有条件都满足 else 没有返回

    with cte as (
    select case
              when account in (‘A’,’B’) and hour_count = 24) then 1 
              when account in (‘C’,’D’) and hour_count > 22) then 1
           end as c_count
      from hour_count)
    select 1 as one       
      from cte
    having sum(c_count)=4 —- if all conditions met
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-03
      相关资源
      最近更新 更多