展平Oracle

时间:2017-04-10 19:24:58

标签: sql oracle

我有一个类似[ 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 ...
)

我也尝试了一些使用分析函数的变体,但ranklag似乎不起作用,因为记录之间的偏移是可变的,我不知道如何让first_value做我想做的事。

直接感谢右边的任何指针,我的Oracle分析技能相当缺乏

1 个答案:

答案 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将包含旧记录以及最新记录。