Oracle获取另一个表中按时间排序的前一行和后一行

Oracle获取另一个表中按时间排序的前一行和后一行,oracle,group-by,analytic-functions,Oracle,Group By,Analytic Functions,我有两个表,每个表都有一个timestamp列。如何查询A中的每一行、B中的第一个前后时间戳 我想: A.id A.timestamp first\u preceding b.timestamp first\u following b.timestamp我想试试这个: SELECT DISTINCT a.id, a.timestamp, b0.timestamp, b1.timestamp FROM a, b b0, b b1 WHERE b0.timestamp = (SELECT MAX(t

我有两个表,每个表都有一个timestamp列。如何查询A中的每一行、B中的第一个前后时间戳

我想:

A.id A.timestamp first\u preceding b.timestamp first\u following b.timestamp

我想试试这个:

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应该工作的原因,也是为什么我希望id`列以同样的方式可用。你看到不同的东西了吗?我假设如果B中有多行满足例如b0测试的要求,那么由于有多个b0.id值,DISTINCT将为每个值提供一个单独的行。这就是问题吗?哇,我不知道你能做到。我很难看到这里发生了什么-为什么我可以选择b0.id,即使b0是maxtimestamp?b0是表b中的一行,这就是b0的意思,所以一旦你有了那一行,你就可以得到你想要的任何列。WHERE子句只是确保b0的时间戳尽可能大。另外,请注意,在子查询中,timestamp是b.timestamp的缩写,因为您是从b.timestamp中选择的。这有用吗?