根据条件和日期范围填充SQL表值

时间:2015-07-25 11:38:01

标签: sql apache-spark apache-spark-sql

我有一个包含4列的SQL表:' date',' machine',' failure'并且警告'。

日期列具有连续日期(日复一日),但重复不同计算机的相同日期。失败列为0s和1s。

警告列目前为空白。我想用' 1'填充警告列值。对于有问题的机器,在失败前30天的每个日期(即失败栏中出现“'”)。

如何为此编写查询?是否有必要创建另一个表?

以下是我尝试的内容:

UPDATE mytable (warning)
SET warning = 1
WHERE (Failure = 1) AND (date BETWEEN (date - 30) AND date)

但这不起作用,因为它排除了没有失败的字段,但仍然在失败的30天内。

我也试过隔离有问题的机器和日期:

SELECT date, machine
FROM mytable
WHERE (Failure = 1)

但是我不确定如何通过填充整个表格中的字段来协调这个子集。

非常感谢任何帮助。我正在寻找一种通用的SQL方法,因为这实际上是针对Apache Spark SQL的。

2 个答案:

答案 0 :(得分:1)

以下是使用exists子句设置warning的方法:

update sqltable t
    set warning = 1
    where exists (select 1
                  from sqltable t2
                  where t2.machine = t.machine and
                        t2.failure = 1 and
                        t2.date between (t1.date - 30) AND t1.date)
                 );

这是标准的SQL,但我并非100%确定它可以在Apache Spark SQL上运行。

答案 1 :(得分:0)

我真的不明白你何时更新,但你需要UPDATE而不是INSERT

UPDATE mytable 
SET warning = 0

THEN

UPDATE mytable 
SET warning = 1
WHERE (Failure = 1) AND (date BETWEEN (date - 30) AND date)