查询查找相邻日期记录

时间:2014-11-13 21:15:06

标签: sql oracle

我的数据库中存在page_history表;我们的想法是,只要page表中的记录发生变化,该记录的旧值就会存储在历史表中。

我现在的工作是找到记录被更改的场合,并检索该更改的前后条件。具体来说,我想知道页面何时更改了组,以及更改中涉及哪些组。我在下面的查询可以找到这些实例,但是使用min函数,我只能找回两个记录之间匹配的值:

 select page_id,
       original_group,
       min(created2) change_date
  from (select h.page_id,
               h.group_id original_group,
               i.group_id new_group,
               h.created_dttm created1,
               i.created_dttm created2
        from   page_history h, 
               page_history i
        where  h.page_id = i.page_id
        and    h.created_dttm < i.created_dttm
        and    h.group_id != i.group_id)
 group by page_id, original_group, created1
 order by page_id

当我尝试获取第二条记录的任何详细信息时,例如new_group,我发现ORA-00979: not a GROUP BY expression错误。我不想通过new_group进行分组,因为这会破坏逻辑(我认为它会找到显示页面从一个组更改为另一个组的记录,无论其他组是否有任何更改两组之间)。

那么,我的问题是,如何修改此查询,或者编写一个新的查询,实现类似的结果,但是增加了两个记录之间不匹配的列的可用性?本质上,如何在不牺牲我不想比较的所有其他列的情况下找到最小记录?我并不完全需要一个完整的答案,任何指出我正确方向的建议都将受到赞赏。

我使用PL / SQL Developer,它看起来像Oracle的11.2.0.2.0版。

编辑:我找到了解决方案。它不漂亮,我仍然希望看到一些替代方案,但如果帮助我将威胁你的大脑爆炸,我会建议重新安置一个更容易的问题。

1 个答案:

答案 0 :(得分:0)

如果没有看到你的表格结构,很难重新编写查询,但是当你使用像这样的min函数时,将它放入一个单独的子选择以获得你想要的东西然后比较它总是更好结果。