【问题标题】:Query that checks for a value A to appear at least B number of times in C columns检查值 A 在 C 列中至少出现 B 次的查询
【发布时间】:2021-10-29 23:15:43
【问题描述】:

我正在尝试从表中选择一些行,其中某些值 ac 列内至少 b 次。

这是我正在处理的数据的简化示例。我正在尝试在至少 2 个问候语中查找具有 h 的行。

greeting1 greeting2 greeting3 farewell1 farewell2
hi hello hey there goodbye peace
hi sup yo Au revoir see ya
yo hola ayyyy hang tight reverse-hi
hola sup hello see ya peace
hello yo hola hang tight ciao
ayyy yo hola hang tight ciao

下面是我想要抓取的行:

greeting1 greeting2 greeting3 farewell1 farewell2
hi hello hey there goodbye peace
hola sup hello see ya peace
hello yo hola hang tight ciao

(为了便于查看,我用斜体和粗体显示)

我只是在学习 SQL,所以这可能是基本的。我遇到了一些困难。我知道获取行并检查所有 greeting1 看起来像:

SELECT *
FROM
  GreetingsAndFarewell
WHERE
  greetings1 LIKE '%h%'
  AND greetings2 LIKE '%h%'
  AND greetings3 LIKE '%h%'

但如果我只关心至少 2 个问候语中是否包含 h 怎么办?

以下是我见过的一些类似问题,但我认为它们中的任何一个都没有真正解决这个问题:

5760335 31577623

【问题讨论】:

  • 如果您将示例数据添加为 DDL+DML,您可以更容易地为人们提供帮助。
  • 和 SQL Server Google Big Query - 请只标记相关产品。

标签: sql sql-server google-bigquery


【解决方案1】:

您可以尝试对 CASE 表达式求和,以检查 3 个问候语中的每一个中的字母 h

SELECT *
FROM GreetingsAndFarewell
WHERE CASE WHEN greetings1 LIKE '%h%' THEN 1 ELSE 0 END +
      CASE WHEN greetings2 LIKE '%h%' THEN 1 ELSE 0 END +
      CASE WHEN greetings3 LIKE '%h%' THEN 1 ELSE 0 END >= 2;

在 BigQuery 上,您或许可以直接对布尔表达式求和并简化为:

SELECT *
FROM GreetingsAndFarewell
WHERE greetings1 LIKE '%h%' + greetings2 LIKE '%h%' + greetings3 LIKE '%h%' >= 2;

【讨论】:

  • 谢谢,你的答案的第二部分我没有运气,但第一部分效果很好。
【解决方案2】:

考虑以下方法(BigQuery)

select *
from GreetingsAndFarewell
where (
  select count(1)
  from unnest([greeting1, greeting2, greeting3]) greeting
  where greeting like '%h%'
) >= 2    

如果应用于您问题中的样本数据 - 输出是

【讨论】:

  • 格式化文本是显示数据的首选方法。它对每个人都更有效。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-01-19
  • 1970-01-01
  • 2015-10-13
  • 2017-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多