我有一个包含多行和以下字段的表:
访客 | 主持人 | 活动 | 时间 |
---|
该表列出了建筑物的访客。 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 子句中的值对(即访问者 - 主机对)。
假设 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)
它应该返回: