2010-03-29 86 views
1

我正在尝试使用DB2的一个非常旧的版本进行分页,我唯一能找出选择一系列行的方法是使用OVER命令。DB2 Over clause问题

此查询提供了正确的结果(我想分页的结果)。

select MIN(REFID) as REFID, REFGROUPID from ARMS_REFERRAL where REFERRAL_ID<>'Draft' and REFERRAL_ID not like 'Demo%' group by REFGROUPID order by REFID desc 

结果:

REFID  REFGROUPID 
    302   242 
    301   241 
    281   221 
    261   201 
    225   142 
    221   161 
    ...   ... 

SELECT * FROM (SELECT row_number() OVER() AS rid, MIN(REFID) AS REFID, REFGROUPID FROM arms_referral where REFERRAL_ID<>'Draft' and REFERRAL_ID not like 'Demo%' group by REFGROUPID order by REFID desc) AS t WHERE t.rid BETWEEN 1 and 5 

结果:

REFID  REFGROUPID 
26   12 
22   11 
14   8 
11   7 
6   4 

正如你所看到的,但它选择了第5行,但它显然不是选择最新的。

如果我将一个Order By子句添加到OVER(),它会变得更近,但仍然不完全正确。

SELECT * FROM (SELECT row_number() OVER (ORDER BY REFGROUPID desc) AS rid, MIN(REFID) AS REFID, REFGROUPID FROM arms_referral where REFERRAL_ID<>'Draft' and REFERRAL_ID not like 'Demo%' group by REFGROUPID order by REFID desc) AS t WHERE t.rid BETWEEN 1 and 5 

REFID  REFGROUPID 
302   242 
301   241 
281   221 
261   201 
221   161 

它真的很接近但第五个结果不正确(实际上是第六个结果)。

如何使此查询正确,以便它可以通过REFGROUPID进行分组,然后通过REFID进行排序?

回答

1

如果您将订单放在包裹的外面,该怎么办?

SELECT * 
FROM (SELECT row_number() OVER (ORDER BY REFGROUPID desc) AS rid, 
MIN(REFID) AS REFID, REFGROUPID FROM arms_referral where REFERRAL_ID<>'Draft' 
and REFERRAL_ID not like 'Demo%' group by REFGROUPID) AS t 
WHERE t.rid BETWEEN 1 and 5 order by REFID desc