跨行的条件查询

pdkcd3nj  于 2021-07-26  发布在  Java
关注(0)|答案(4)|浏览(381)

我使用bigquery尝试建立示例,其中不同的会话在同一会话中有许多错误标志,并返回其中一个特定的错误。例子:

session_id  fault
1234        a
1234        b
1234        c
1234        d
5678        a
5678        c
9012        b
4567        a
4567        c

在上表中,我将查找发生了错误a、b、c、d的不同会话,并仅返回带有会话id和错误c的行(以及此行中的其他列)以供进一步分析。我尝试了不同的where语句,但不确定会话id应该等于什么。
理想情况下,这将为每个不同的会话返回一行。例子:

SELECT *
FROM
(SELECT *
FROM table
WHERE session_id = ?
AND fault IN ('a', 'b', 'c', 'd'))
WHERE fault = 'c'
9avjhtql

9avjhtql1#

你似乎发现下面有条件的拒绝

select session_id from table
where fault IN ('a', 'b', 'c', 'd')
group by session_id
having count( distinct fault)=4
t9aqgxwy

t9aqgxwy2#

下面是bigquery标准sql


# standardSQL

SELECT AS VALUE ANY_VALUE(t)
FROM `project.dataset.table` t  
WHERE fault IN ('a', 'b', 'c', 'd')
GROUP BY session_id

它返回所选行中的所有列
如果您需要选择last的逻辑(比如说按错误排序),那么您可以使用下面的版本


# standardSQL

SELECT AS VALUE ARRAY_AGG(t ORDER BY fault DESC LIMIT 1)[OFFSET(0)]
FROM `project.dataset.table` t  
WHERE fault IN ('a', 'b', 'c', 'd')
GROUP BY session_id
brccelvz

brccelvz3#

如果你特别想要故障“c”,那么

select (array_agg(t order by (fault = 'c') desc limit 1))[ordinal(1)].*
from t
where fault in ('a', 'b', 'c', 'd')
group by session_id
having count(distinct fault) = 4;

如果会话中没有重复出现故障(如示例数据中所示),则可以使用:

select t.*
from (select t.*,
             count(*) over () as cnt
      from t
      where fault in ('a', 'b', 'c', 'd')
     ) t
where cnt = 4 and fault = 'c';

如果它们可以重复,你可以使用 count(distinct) 取而代之的是:

select t.*
from (select t.*,
             count(distinct fault) over () as cnt
      from t
      where fault in ('a', 'b', 'c', 'd')
     ) t
where cnt = 4 and fault = 'c';
2nc8po8w

2nc8po8w4#

很多其他的好答案,但这可以用基本原则来解决:选择有错误c的行,选择有4个错误的行(或者任何你需要的标准),然后加入。

with faults_c as ( 
  select * from table where fault = c
),
faults_4 as (
  select session_id from table 
  group by 1 
  having count(distinct fault) = 4
)
select *
from faults_c
inner join faults_4 using(session_id)

相关问题