问题描述
我在 clickhouse 有 events
表。
当某个用户(由 user_id 定义)进入房间(由 object_id 定义)或离开房间时,应该打开由钥匙卡打开的电子锁,因此对于与锁的每次交互,events
表中都有一个记录相应的 event_type
设置为“来”或“左”。
CREATE TABLE default.events
(
`user_id` UInt32,-- user of event
`object_id` UInt32,-- object of event
`event_type` String,-- type of event,can be "came" or "left"
`event_moment_date` Date,-- date of event
`event_moment` DateTime -- datetime of event
)
ENGINE = MergeTree(
event_moment_date,(
object_id,user_id,event_moment
),8192)
我需要以表格形式输出数据:
user_id,-- user
object_id,-- object
came_moment,-- moment then user entered the room
left_moment -- moment then user leaved the room
因此,对于每个“来”事件,我需要找到匹配的“左”事件,该事件具有相等的 user_id 和 object_id,并且在相对于“来” event_moment 的最近可能的将来具有 event_datetime。
我可以在 MysqL/Postgrsql 中使用这样的子查询轻松做到这一点:
SELECT
s1.object_id,s1.user_id,s1.action_moment as "came_moment",(
select s2.action_moment from source as s2
where
s1.user_id = s2.user_id
and
s1.object_id = s2.object_id
and
s1.action_moment < s2.action_moment
and
s2.action_type = 'left'
order by s2.action_moment asc
limit 1
) as "left_moment"
FROM
source as s1
where s1.action_type = 'came'
但 Clickhouse 不允许在子查询(依赖子查询)中使用外部查询字段。
我也尝试过使用 JOIN,但 Clickhouse 不允许在 JOIN 的 ON 语句中使用“”。此外,我尝试使用 Clickhouse 的 neighbour
函数,按 event_moment 排序,但我通过对数据进行排序并选择,只选择了具有特定 came_moment
和相应 left_moment
的单行下一个邻居行,我似乎无法加载此类行的完整列表。
我开始认为我的任务在 ClickHouse 中是不可能的,我需要某种脚本(PHP/python/whatever)来扫描数据库并添加一些“session_id”字段,每个字段都应该具有相同的 ID 号“来”和“左”对应的两行。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)