Oracle在另一个表中获取按时间排序的前行和后行
Posted
技术标签:
【中文标题】Oracle在另一个表中获取按时间排序的前行和后行【英文标题】:Oracle get first preceding and following rows ordered by time in another table 【发布时间】:2012-11-01 23:54:16 【问题描述】:我有 2 个表,每个表都有一个时间戳列。如何查询A中的每一行,B中的第一个前后时间戳?
我想要:
A.id A.timestamp first_preceding(B.timestamp) first_following(B.timestamp)
【问题讨论】:
【参考方案1】:我会试试这个:
SELECT DISTINCT a.id, a.timestamp, b0.timestamp, b1.timestamp
FROM a, b b0, b b1
WHERE
b0.timestamp = (SELECT MAX(timestamp) FROM b WHERE timestamp < a.timestamp)
AND b1.timestamp = (SELECT MIN(timestamp) FROM b WHERE timestamp > a.timestamp);
【讨论】:
在列列表中添加, b0.id, b1.id
可以得到B行的ID。
是的,但我需要 b 中 b.timestamp 为最大值或最小值的行的 ID,而不仅仅是叉积中的所有 ID
我认为 WHERE 子句会为您挑选出相关的行。这就是为什么b0.timestamp, b1.timestamp' should work, and why I expect that the
id` 列以相同的方式可用的原因。你看到了什么不同的东西吗?我想如果 B 中有多个行满足(例如)b0
测试,那么由于有多个b0.id
值,DISTINCT
将为每个值提供一个单独的行。是这个问题吗?
哇,我不知道你能做到。我无法看到这里发生了什么 - 为什么我可以选择 b0.id 即使 b0 是 max(timestamp) ?
b0
是表b
中的一行(这就是b b0
的意思),所以一旦你有了那一行,你就可以得到任何你想要的列。 WHERE
子句只是确保b0
的时间戳与您想要的一样大。另外,请注意,在子查询中,timestamp
是 b.timestamp
的缩写,因为您选择的是 b
。这有帮助吗?以上是关于Oracle在另一个表中获取按时间排序的前行和后行的主要内容,如果未能解决你的问题,请参考以下文章