BigQuery WHERE 语句过滤掉值对

问题描述 投票:0回答:1

我有一个包含多行和以下字段的表:

访客 主持人 活动 时间

该表列出了建筑物的访客。 Visitor 是访客的名字,Host 是他们正在访问的公司,Event 是'IN' 或'OUT' 表示访客在 Time 进入或离开大楼

访客 主持人 活动 时间
艾伦 GraphicsMan 12:34
艾伦 GraphicsMan 出去 13:44
巴里 代码人 14:31
卡拉 代码人 15:10
丹妮尔 安全人 15:13
卡拉 代码人 出去 15:31
卡拉 安全人 15:35

我希望我的查询返回当前正在访问的所有访问者以及他们正在访问的人。换句话说,我想要所有具有“IN”事件但没有“OUT”事件的访问者-主机对。对于上面的示例表,查询应返回:

访客 主持人 活动 时间
巴里 代码人 14:31
丹妮尔 安全人 15:13
卡拉 安全人 15:35

我得到的最接近的是:

with entrances as (SELECT visitor FROM table where event = 'IN'), 
exits as (SELECT visitor FROM table WHERE event = 'OUT'),
SELECT * from table
WHERE visitor IN entrances AND visitor NOT IN exits

返回

访客 主持人 活动 时间
巴里 代码人 14:31
丹妮尔 安全人 15:13

Carla 将被排除在外,因为她在返回拜访另一位房东之前进出大楼。我正在尝试想出一种方法来检查 where 子句中的值对(即访问者 - 主机对)。

google-bigquery conditional-statements where-clause
1个回答
0
投票

假设 OUT 总是在 IN 之后加上时间戳,COUNT

 可用于查找 IN 没有对应 OUT 的情况。

SELECT visitor, host, time FROM ( SELECT visitor, host, COUNTIF(event='IN') ins, COUNTIF(event='OUT') outs, MAX(time) time FROM table GROUP BY visitor, host HAVING ins > outs)
它应该返回:

行访客房东时间1巴里代码人14:31:002卡拉安全人15:35:003丹妮尔安全人15:13:00
© www.soinside.com 2019 - 2024. All rights reserved.