我有一个类似[ id, group, reading, reading_date ]
的表格,其中包含特定群组的阅读值,这些值会在一天内定期填写。
我希望生成类似[ id, group, reading, reading_date, prev_reading, prev_date ]
的结果,其中上一个阅读/日期是至少比reading_date
早一天的组的最新值
基本上我似乎应该能够自我加入并获得至少一天的阅读ID,但我找不到真正有效的组合。
select h1.id, h1.group, h1.reading, h1.reading_date, h2.id prev_id
from history h1, history h2
where h2.id = (
select ...
)
我也尝试了一些使用分析函数的变体,但rank
和lag
似乎不起作用,因为记录之间的偏移是可变的,我不知道如何让first_value
做我想做的事。
直接感谢右边的任何指针,我的Oracle分析技能相当缺乏
答案 0 :(得分:1)
也许是这样的?
SELECT h1.id, h1.group, h1.reading, h1.reading_date
, MAX(h2.id) KEEP (DENSE_RANK FIRST ORDER BY h2.reading_date DESC) AS prev_id
, MAX(h2.reading) KEEP (DENSE_RANK FIRST ORDER BY h2.reading_date DESC) AS prev_reading
, MAX(h2.reading_date) KEEP (DENSE_RANK FIRST ORDER BY h2.reading_date DESC) AS prev_date
FROM history h1 LEFT JOIN history h2
ON h1.group = h2.group
AND h1.reading_date - 1 >= h2.reading_date
GROUP BY h1.id, h1.group, h1.reading, h1.reading_date;
这将获得h2
中最近的记录,该记录至少比h1中的记录早一天。请注意,h1
将包含旧记录以及最新记录。