平台: 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查询似乎这是一个很常见的事情(确实是我需要工作的数据库) 用)。
谢谢!
答案 0 :(得分:2)
尝试使用LAG功能的方法:
NSNotificationCenter* center = [[NSWorkspace sharedWorkspace] notificationCenter]
答案 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