SQL:表示例中的先前版本

时间:2015-08-15 15:20:59

标签: sql oracle10g greatest-n-per-group

我需要一些帮助。 有一个包含大量数据的表格。 formtype,item_code,verion

所以我必须选择实际的formtype和item_code。 (实际版本的最大版本)。我尝试了max和great,但它没有用。所有版本都被选中。但我不知道为什么。

例如:

选择是:

select formtype, item_code, max(version) 
from table_name;

结果:

query result

我尝试过最好,但它的工作方式相同。 所以我只需要最后一个版本 - 实际版本(9)。 该表包含数千个fromtype和item_code,版本不同。

还有其他部分。 如果它能够工作,我需要选择previos版本。 (在示例中表示版本最大值之前)。

我试过子查询。

select b.formtype, b.item_code, max(b.version) from vps_form t,
(select formtype, item_code, version) b 
where t.formtype = b.formtype
and t.item_code = b.item_code
group by b.formtype, b.item_code, b.version;

那么sombody可以帮助它有什么问题吗? 感谢。

1 个答案:

答案 0 :(得分:0)

你刚刚错过了这个小组:

select formtype, 
       item_code, 
       max(version) 
from vps_form
group by formtype, item_code;

要获得最新版本和之前版本,可以使用窗口函数完成:

select formtype, item_code, version
from (
  select formtype, 
         item_code, 
         version,
         row_number() over (partition by formtype, item_code order by version desc) as rn
  from vps_form 
) t
where rn <= 2
order by formtype, item_code, version;

或者,如果您需要将最新版本和先前版本作为一行中的两列:

select formtype, item_code, version, prev_version
from (
  select formtype, 
         item_code, 
         version,
         row_number() over (partition by formtype, item_code order by version desc) as rn, 
         lag(version) over (partition by formtype, item_code order by version desc) as prev_version
  from vps_form 
) t
where rn = 2
order by formtype, item_code, version;

SQLFiddle:http://sqlfiddle.com/#!4/2bd0f/2