sexylegs 发表于 2013-01-24 11:46

求助,使用SYbase数据库先分组再排序最后取后两条数据的SQL



如图所示,协议号(VERIFYAGRNO),账单号(RPTNO),出单日期(RPTDATE),一个协议号可对应多个账单号,出单日期就是数据生成的日期。
这里需要先根据VERIFYAGRNO分组,再按RPTDATE进行排序最后取排序后的最后两条数据(对应图中的红色框内的数据)。

比如在Oracle中可以使用分析函数ROW_NUMBER()OVER(PARTITION BY 字段1 ORDER BY 字段2 DESC)来实现。
Eg:
SELECT VERIFYAGRNO AS verifyagrno,RPT_NO AS rptNo,RPT_DATE AS rptDate
FROM (
   SELECT VERIFYAGRNO,RPT_NO,RPT_DATE,
      ROW_NUMBER()OVER(PARTITION BY VERIFYAGRNO ORDER BY RPT_DATE DESC) periodNo
   FROM T_CHECK_BILL
   WHERE VERIFYAGRNO IN ('121212','131313')
   ORDER BY RPT_DATE
)
WHERE periodNo <= 2

但是在Sybase中没有这个分析函数,本人对Sybase不太熟悉,请问各位大师,Sybase中有什么函数或者其他的方式实现吗?
能给出SYbase的SQL语句最好啊,先拜谢了。

zhaopingzi 发表于 2013-01-24 15:09

你是要选账单号的个数小于等于2的协议号吗?

zhaopingzi 发表于 2013-01-24 15:11

看你写的那个oracle的语句,感觉写的太复杂,应该有简答的

baiynije 发表于 2013-01-24 15:33

sybase 没有row_number()函数,可以用如下的方式来实现
SELECT VERIFYAGRNO,RPT_NO,RPT_DATE
FROM T_CHECK_BILL a
where (select count(*) from T_CHECK_BILL b where a. VERIFYAGRNO = b. VERIFYAGRNO and a.RPT_NO < b.RPT_NO) <= 1

sexylegs 发表于 2013-01-24 16:07

回复 2# zhaopingzi


    是要分别找出协议号121212和131313对应账单号、出单日期等,但是最近两次插入数据库的,数据在每次插入数据库时会生成出单日期。

sexylegs 发表于 2013-01-24 16:27

回复 4# baiynije


    这位大师,你给的SQL能满足我的需求,谢谢您啦。小弟不才,想请教一下这个SQL的执行顺序,或者原理吧,看得有点懵,呵呵。
页: [1]
查看完整版本: 求助,使用SYbase数据库先分组再排序最后取后两条数据的SQL