在T-SQL中的行内按时间顺序比较

时间:2015-02-04 21:27:31

标签: sql-server database

我正在使用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

此表的情况很简单,只要在表格中输入12的值,稍后(按时间顺序排列)的值就不能是{{1} }。这是数据输入错误,必须通过将0更改为0来解决此问题。

因此,在上面的简化示例中,2对于人ID2有误。

对于4人,有人在2上输入0,而对于2015-01-01 00:00:00人,有人在4上输入0 }。

我是SQL的新手,老实说,只是将整个事物导出为csv,在R中打开它,找到问题,然后在数据库中用更新语句更新值。但我觉得这是一个在SQL上变得更好的机会 - 不幸的是,我被困住了。

这里我需要一些方法来比较表中的行,因为它们是按ID分组,还要考虑这个时间顺序。我已尝试使用2015-01-01 00:00:00语句进行笛卡尔联合,但这种做法并不奏效。 任何帮助将不胜感激。

2 个答案:

答案 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