SQL如何使用datediff排除数据并且不存在于同一个表中

Posted

技术标签:

【中文标题】SQL如何使用datediff排除数据并且不存在于同一个表中【英文标题】:SQL how to exclude data using datediff and not exists in same table 【发布时间】:2020-04-18 00:02:54 【问题描述】:

我试图在我的查询中排除一些数据,但在搜索关键字后无法弄清楚自己。

上面是示例表,其中包含我在以下查询中的列:

SELECT id, date, health, state, reason FROM table1

我的目标是排除 (state = START) 情况和 (health = NO && reason = REASON1) 情况,如果这发生在 START 发生后 10 分钟内。在 START 事件 10 分钟后可能会出现 (health = NO && reason = REASON1),如果 10 分钟内的条件不满足,我想将它们留在那里。

以下是我想要达到的目标。

排除 (state = START) 非常简单:

SELECT id, date, health, state, reason FROM table1 WHERE state not in ('START')

但如果这发生在 START 发生部分后 10 分钟内,我无法弄清楚如何排除(健康 = NO && 原因 = REASON1)。

我的想法是使用 DATEDIFF 并且不存在,如下所示:

SELECT id, date, health, state, reason FROM table1 WHERE state not in ('START') and (health = 'NO' and reason = 'REASON1' and DATEDIFF(minute,(current_date)?,(last starting time)?) < 15)

(current_date)?,(上次开始时间)?部分我不确定如何实现这一点。我想我也应该使用 NOT EXISTS 作为第二种情况,但是我尝试过的那个没有用。任何人都可以帮助或指导我前进吗?

【问题讨论】:

【参考方案1】:

如果我理解正确,您可以使用窗口函数来计算上一个开始日期。那么过滤就很简单了:

SELECT id, date, health, state, reason
FROM (SELECT t1.*,
             MAX(CASE WHEN state = 'START' THEN date END) OVER (PARTITION BY id ORDER BY date) as prev_start_date
      FROM table1 t1
     ) t1
WHERE state <> 'START' OR
      (health = 'NO' AND
       reason = 'REASON1' AND
       prev_start_date > date - interval 10 minute
      );

【讨论】:

您好,感谢您提到窗口功能,它非常有用,我在周末进行了此操作。从您的回答中,我要排除的第二个条件仍然显示在结果中,因为 state &lt;&gt; 'START' 显示了我要排除的数据。如果我单独运行这些 OR 条件,它们是正确的,但是当我使用 OR 时,它们仍然出现,因为第二个条件不是 START SELECT id, date, health, state, reason FROM (SELECT t1.*, MAX(CASE WHEN state = 'START' THEN date END) OVER (PARTITION BY id ORDER BY date) as prev_start_date FROM table1 t1 ) t1 WHERE id = '2200' AND date between '2020-04-09 00:00:00' and '2020-04-11 23:00:00' AND ( state not in ('START') OR (reason = 'REASON1' AND extract(epoch from (date - prev_start_date)) &gt; 60 * 10) ); 这是我运行的确切查询。

以上是关于SQL如何使用datediff排除数据并且不存在于同一个表中的主要内容,如果未能解决你的问题,请参考以下文章

存在匹配时排除不匹配行的 SQL 多对多连接

SPARK SQL 中的 DATEDIFF

DateDiff Sql 查询不包括周末作为变量使用变量创建 > X

如何在nHibernate中使用datediff sql函数?

求sql server 循环语句的强细写法,要求有例子

高手进!如何把Sql里面的datediff()方法,在Oracle里面如何替换使用啊?