我有一个SQL表,有4列:'日期','机器','故障'和'警告'。
date列有连续的日期(每天),但是在不同的机器上重复相同的日期。失效列为0和1
警告列当前为空。我想在故障前30天的每个日期(即当故障列中出现'1'时)用'1'填充有问题的机器的警告列值。
我怎么写一个查询?有必要再创建一个表吗?
这是我尝试过的:
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。
下面是使用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
我真的不明白你什么时候更新,但你需要UPDATE
而不是INSERT
UPDATE mytable
SET warning = 0
然后UPDATE mytable
SET warning = 1
WHERE (Failure = 1) AND (date BETWEEN (date - 30) AND date)