【问题标题】:SQL - Comparing dates efficiently for specific IDsSQL - 有效地比较特定 ID 的日期
【发布时间】:2021-11-21 05:54:07
【问题描述】:

我有两个如下所示的数据库:

表 1

ID time1
1 21.3.2000, 16:00
1 21.3.2000, 17:00
... ...
2 21.3.2000, 16:00
... ...

表 2

ID time2
1 21.3.2000, 16:30
1 21.3.2000, 18:00
... ...
2 21.3.2000, 15:30
... ...

对于每个ID,我有几个日期time1time2
对于每个time1,我想要最接近的time2,它也不大于time1
我尝试过,但甚至像这样构建 carthesian 产品:

SELECT h."ID", h."time", m."time"
FROM Table1 as h, Table2 as m
WHERE h."ID" = m."ID"

由于数据量很大,加载时间很长,有什么办法可以提高速度并获得相同的结果?

【问题讨论】:

  • 您的应用程序是否允许您限制时间范围?你能说“对于每个time1,我想要在time1 两小时内最接近的time2”或类似的限制吗?
  • 这可能行得通,但并不理想,但如果我对时间框架很慷慨,那应该没问题,如果您有示例代码,请与我分享吗?
  • 你说得对,time2应该在table2,我的错
  • 如果 time1 是 21.3.2000, 16:00,您只想考虑大于它的时间还是考虑更小的时间,例如21.3.2000, 15:4521.3.2000, 16:30?
  • 我想匹配最接近 time1 但不大于 time1 的,我一定要把它添加到问题中!

标签: sql database postgresql


【解决方案1】:

您提到 time2 可能大于或等于 time1...这简化了逻辑。我会尝试横向连接:

SELECT *
FROM table1
LEFT JOIN LATERAL (
    SELECT *
    FROM table2
    WHERE table2.ID = table1.ID AND table2.time2 >= table1.time1
    ORDER BY table2.time2
    LIMIT 1
) AS table2_new ON true

【讨论】:

  • 五分钟前我在这篇文章social.msdn.microsoft.com/Forums/sqlserver/en-US/… 中找到了确切的想法,我想知道为什么它这么快,非常感谢您的回答,您能否简要解释一下为什么会这样比做carthesian产品然后过滤要快得多吗?仅仅是因为我们缩短了第二张桌子的长度还是还有更多?
  • 老实说,这就是我在 SQL Server 中用于诸如此类的查询的内容(在那里它被称为 TOP 1 和 OUTER APPLY)。使用这些而不是简单的连接,因为逻辑是直截了当的。由于我不知道的原因,性能非常好。但很明显,横向连接不会产生 m x n 叉积。
  • 直到现在我才听说,考虑到 SQL 中的性能并不是那么重要,因为它有出色的编译器,这就是为什么我认为它也主要是交叉产品。
  • 非常感谢您的回答,我会更多地研究不同类型的连接,有没有你认为特别有用的连接,菜鸟在这里你可以看到^^跨度>
  • 只关注内在和外在。 LATERAL 仅在少数情况下使用,例如这种情况。
猜你喜欢
  • 2010-09-06
  • 1970-01-01
  • 2017-06-23
  • 1970-01-01
  • 2015-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多