如何从单个表中的多个记录中获取单个结果?

时间:2015-07-26 06:02:37

标签: sql oracle

平台: Oracle 10g

我有一张桌子(让我们称之为t1),如下所示:

ID  | FK_ID | SOME_VALUE | SOME_DATE
----+-------+------------+-----------
1   | 101   | 10         | 1-JAN-2013
2   | 101   | 20         | 1-JAN-2014
3   | 101   | 30         | 1-JAN-2015
4   | 102   | 150        | 1-JAN-2013
5   | 102   | 250        | 1-JAN-2014
6   | 102   | 350        | 1-JAN-2015

对于每个FK_ID,我希望显示单个结果,显示最近的两个SOME_VALUE。那就是:

FK_ID | CURRENT | PREVIOUS
------+---------+---------
101   | 30      | 20
102   | 350     | 250

t2还有另一个表(我们称之为FK_ID),这里有一个参考 说哪个是'CURRENT'记录。所以表格如下:

ID  | FK_CURRENT | OTHER_FIELDS
----+------------+-------------
101 | 3          | ...
102 | 6          | ...

我试图通过有缺陷的子查询连接来尝试这一点:

SELECT id, curr.some_value as current, prev.some_value as previous FROM t2
  JOIN t1 curr ON t2.fk_current = t1.id 
  JOIN t1 prev ON t1.id = (
    SELECT * FROM (
      SELECT id FROM (
        SELECT id, ROW_NUMBER() OVER (ORDER BY SOME_DATE DESC) as rno FROM t1
          WHERE t1.fk_id = t2.id
      ) WHERE rno = 2
    )
  )

然而t1.fk_id = t2.id有缺陷(即不会跑),因为(我现在知道)你无法通过父母 将字段值转换为多个深度的子查询。

然后我开始想知道Common Table Expressions(CTE)是否是这个的工具,但后来我没有 使用这些的经验(所以我想知道我不会试图使用它们 - 如果这是工具)。

所以我认为绊倒我的关键复杂性是:

  • 通过排序确定先前的值,但同时将其限制为第一个记录(而不是整个表)。 (因此有点复杂的子查询尝试。)

否则,我可以编写一些代码来首先执行查询以获取“当前”值,然后 执行第二个查询以获取“上一个” - 但我很想知道如何用一个单独解决这个问题 SQL查询似乎这是一个很常见的事情(确实是我需要工作的数据库) 用)。

谢谢!

2 个答案:

答案 0 :(得分:2)

尝试使用LAG功能的方法:

NSNotificationCenter* center = [[NSWorkspace sharedWorkspace] notificationCenter]

演示:http://sqlfiddle.com/#!4/d3e640/15

答案 1 :(得分:1)

试试这个:

select t1.FK_ID ,t1.SOME_VALUE as CURRENT,
(select SOME_VALUE from t1 where p1.id2=t1.id and t1.fk_id=p1.fk_id) as PREVIOUS 
from  t1 inner join
(
  select t1.fk_id, max(t1.id) as id1,max(t1.id)-1 as id2 from  t1 group by t1.FK_ID 
) as p1 on t1.id=p1.id1