【问题标题】:Finding Dataset "edges" in SQL在 SQL 中查找数据集“边”
【发布时间】:2013-04-05 22:42:22
【问题描述】:

我有大量数据被错误地加载到 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 和

基本上,我需要某种回顾+展望机制。以编程方式,这意味着遍历每一行并检查日期的 day 是否与下一行相同,并检查 time 是否早于上一行.但是,我确信在 SQL 中有更好的方法来做到这一点......

【问题讨论】:

  • 什么是 RDBMS?需要知道函数名称才能从(明显的)datetime 列中提取 datetime
  • 这是 Vertica,但我只需要一些用于逻辑的 SQL 伪代码。我可以在实现中处理我的 RDBMS 的细节。现在我想起来,它本身就是两个连接,也许?一个是 b.id = a.id - 1,另一个是 b.id = a.id + 1?嗯...
  • 我在想一个单一的SELF JOIN
  • 标准 SQL 中的“look-back”和“look-forward”是通过窗口函数完成的。 lag()lead()。不知道 Vertica 是否支持。
  • 啊哈,滞后()和领先()!谢谢@a_horse_with_no_name...我会试着摆弄那些。

标签: sql database vertica


【解决方案1】:

不完全是您正在寻找的内容,但它会提供给定日期不同步的所有行对。

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;

这里是SQL Fiddle

【讨论】:

    猜你喜欢
    • 2013-11-27
    • 1970-01-01
    • 1970-01-01
    • 2011-10-29
    • 1970-01-01
    • 1970-01-01
    • 2023-02-10
    • 2022-01-24
    • 1970-01-01
    相关资源
    最近更新 更多