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 的时间戳与您想要的一样大。另外,请注意,在子查询中,timestampb.timestamp 的缩写,因为您选择的是 b。这有帮助吗?

以上是关于Oracle在另一个表中获取按时间排序的前行和后行的主要内容,如果未能解决你的问题,请参考以下文章

深入JS正则先行和后行断言

oracle 表中如何对按含有字母和数字的编号来进行排序

如何比较 Oracle 中的记录集或记录组?

当在另一个表中找到关联值时,Oracle 在列中设置值

插入和提交后行从 SQL Server 表中消失

MySQL:按日期选择前 5 个和后 5 个条目,1 个查询,没有子查询