【问题标题】:How can I find all rows with time values between those on other rows?如何找到所有行的时间值在其他行之间?
【发布时间】:2021-04-26 15:03:51
【问题描述】:

我正在尝试创建一个 SQL 查询来收集在“c4”事件期间发生的所有事件。换句话说,我想在 c4 期间获取所有具有 startTime 或 endTime 的行。

eventId machineId startTime endTime
a3 1 9:19 9:41
c4 1 9:15 9:42
a9 1 9:16 9:18
b3 1 9:40 9:46
j5 1 9:51 9:52
g6 2 9:57 9:59

在上表中,我希望返回 a3、a9 和 b3。

我的尝试如下,但我不知道如何区分被检查行的时间或 c4 行的时间。

COUNTIF(
    eventId = 'c4' 
    AND UNIX_SECONDS(startTime) > UNIX_SECONDS(startTime) 
    AND UNIX_SECONDS(endTime) < UNIX_SECONDS(endTime)) OVER (
        PARTITION BY machineId
) AS is_during_c4

感谢任何指导。

【问题讨论】:

    标签: sql google-bigquery


    【解决方案1】:

    你可以使用join:

    select t.*
    from t join
         t tc4
         on (t.starttime between tc4.starttime and tc4.endtime or
             t.endtime between tc4.starttime and tc4.endtime
            ) and
            tc4.eventid = 'c4';
    

    注意,这种情况下通常需要的是任何重叠,上面的逻辑没有捕捉到:

    C4         -----XXXXXXX------
    A9         --AAAAAAAAAAAA----
    

    为此,逻辑是:

    select t.*
    from t join
         t tc4
         on t.starttime < =tc4.endtime and
            t.endtime >= tc4.starttime and
            tc4.eventid = 'c4';
    
    
        
    

    【讨论】:

    • 谢谢。所以基本上我离开加入了一个基于重叠开始和结束时间的 c4 事件?
    • @mongoose132 。 . .是的,就是这个想法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-08
    • 2021-07-17
    • 2021-01-02
    • 2016-10-09
    • 2019-09-11
    • 2022-07-13
    • 2022-08-18
    相关资源
    最近更新 更多