我正在使用t-sql。
我有一个名为mytable
看起来像这样:
ID Num Date
1 0 2015-01-01 00:00:00
1 0 2015-01-02 00:00:00
1 1 2015-01-03 00:00:00
1 2 2015-01-04 00:00:00
2 0 2015-01-01 00:00:00
2 1 2015-02-01 00:00:00
2 0 2015-03-01 00:00:00
3 1 2014-01-01 00:00:00
3 2 2014-01-02 00:00:00
4 2 2015-02-01 00:00:00
4 0 2015-02-02 00:00:00
4 2 2015-02-05 00:00:00
此表的情况很简单,只要在表格中输入1
或2
的值,稍后(按时间顺序排列)的值就不能是{{1} }。这是数据输入错误,必须通过将0
更改为0
来解决此问题。
因此,在上面的简化示例中,2
对于人ID
和2
有误。
对于4
人,有人在2
上输入0
,而对于2015-01-01 00:00:00
人,有人在4
上输入0
}。
我是SQL的新手,老实说,只是将整个事物导出为csv,在R中打开它,找到问题,然后在数据库中用更新语句更新值。但我觉得这是一个在SQL上变得更好的机会 - 不幸的是,我被困住了。
这里我需要一些方法来比较表中的行,因为它们是按ID分组,还要考虑这个时间顺序。我已尝试使用2015-01-01 00:00:00
语句进行笛卡尔联合,但这种做法并不奏效。
任何帮助将不胜感激。
答案 0 :(得分:2)
此查询将选择所有有问题的记录:
SELECT *
FROM mytable AS t
WHERE Num = 0 AND EXISTS (SELECT 1
FROM mytable
WHERE Num IN (1,2) AND ID = t.ID AND Date < t.Date)
选择Num=0
或 Num=1
前记录的所有Num=2
条记录{{1} }}
<强>输出:强>
ID
要更新表格,请执行以下操作:
ID Num Date
------------------
2 0 2015-03-01
4 0 2015-02-02
答案 1 :(得分:0)
您可以将表连接回自身并将逻辑放入,如下所示:
select *
from mytable t
join mytable p on t.id = p.id
and t.date > p.date
and t.num < p.num
如果存在多个先前问题,这将为您提供“额外”行。要解决此问题,您可以按以下方式进行分组:
select id, Date, max(priornum) as max_prior
from (
select t.id, t.Date, p.num as priornum
from mytable t
join mytable p on t.id = p.id
and t.date > p.date
and t.num < p.num
) sub
group by id, Date
或使用over和distinct(对于更现代的服务器版本):
select distinct t.id, t.num, t.Date,
max(p.num) OVER (partition by t.id, t.Date) as max_prior
from mytable t
join mytable p on t.id = p.id
and t.date > p.date
and t.num < p.num