sql - 如何找到所有行的时间值在其他行之间?
问题描述
我正在尝试创建一个 SQL 查询来收集在“c4”事件期间发生的所有事件。换句话说,我想在 c4 期间获取所有具有 startTime 或 endTime 的行。
事件 ID | 机器编号 | 开始时间 | 时间结束 |
---|---|---|---|
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
任何指导表示赞赏。
解决方案
您可以使用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';
推荐阅读
- c++ - 使用 init_from_source 时的 Boost.Log 链接器错误
- sql-server - 在存储过程中嵌套 if 语句
- rest - 如何将 GCP 数据库与 App 引擎 (Flex) 服务 (API .NET) 结合使用
- java - 如何在 Java 中使用 OpenCV Imgproc.HoughLines?
- ios - Xcode 添加多个字符串消息体
- javascript - SignalR 多客户端事件处理
- android - 当我增加图标大小时,侧边栏菜单图标被修剪
- c# - 如何在 MSChart 中为黑白打印制作虚线或虚线列
- javascript - 在带有标签的图表js中创建饼图
- c# - .net 正则表达式集成