我有一组庞大的数据被错误地加载到SQL数据库中(如果这很重要的话,它是一个Vertica数据库)。
每一行都有一个id和一个时间戳。数据按顺序加载(顺序ID),但时间戳转换不正确,导致所有时间都加载为“AM”。
以下是数据库中的内容的简化示例:
id | time
001 | 2013-01-01 00:00:01 // Jan 1st
002 | 2013-01-01 01:20:00
... | ...
500 | 2013-01-01 11:59:59
501 | 2013-01-01 00:00:01 // should be 12:00:01 (PM)
502 | 2013-01-01 00:10:00 // should be 12:10:00 (PM)
... | ...
750 | 2013-01-01 11:59:59 // should be 23:59:59 (PM)
751 | 2013-01-02 00:00:00 // next day (the 2nd)
我需要一个查询,它会找到需要12小时添加到他们时间的行的ID范围。例如,对于上面的示例数据,返回的行应为501, 750
。这样我可以添加12小时,其中id> = 501,< = 750。
基本上,我需要某种回顾+前瞻机制。以编程方式,它将意味着迭代每一行并检查日期的 day 是否与下一行相同,并检查时间是否早于前一行。但是,我确信在SQL中有更好的方法...
答案 0 :(得分:0)
不完全您正在寻找的内容,但它会在给定的一天内提供所有不同步的行对。
SELECT t1.id As 'ID1', t1.timestamp As 'Stamp1', t2.id As 'ID2', t2.timestamp As 'Stamp2'
FROM Table1 t1
JOIN Table1 t2 ON Date(t1.timestamp) = Date(t2.timestamp) AND
Time(t2.timestamp) <= Time(t1.timestamp) AND
t1.id <= t2.id
WHERE t1.id <> t2.id OR Time(t2.timestamp) <> Time(t1.timestamp)
ORDER BY t1.id;