从dummy_table中选择pdate、ac_no、bal;
PDATE | AC_NO | BAL
14/02/2012| abcd | 1200
15/02/2012| abcd | 1300
29/02/2012| abcd | 1300
我的问题是如何使结果集获取
PDATE | AC_NO | BAL
14/02/2012| abcd | 1200
29/02/2012| abcd | 1300
那是相同余额的最长日期?
我曾尝试在ORACLE查询中使用MAX和Distinct,但它们不起作用。
所以在我看来,你的问题可以这样重新陈述:
每当有一组具有相同
AC_NO
和BAL
的连续行时,只返回其中的最后一行,其中连续和最后都表示按PDATE
排序。
以下是我在SQLServer:中处理此问题的方法
SELECT
MAX(PDATE) AS PDATE,
AC_NO,
BAL
FROM (
SELECT
YourTable.*,
ROW_NUMBER() OVER (PARTITION BY AC_NO ORDER BY PDATE) -
ROW_NUMBER() OVER (PARTITION BY AC_NO, BAL ORDER BY PDATE) AS grp
FROM YourTable
) s
GROUP BY
AC_NO,
BAL,
grp
ORDER BY
AC_NO,
MAX(PDATE)
;
基本上,查询使用双重排序来确定AC_NO
和BAL
相同的连续行组。因此,每个这样的组都会接收一个额外的属性,该属性与AC_NO
和BAL
一起唯一地标识该组,然后您只需要使用这三列来对行进行分组并获得MAX(PDATE)
。
我希望它在Oracle中的工作效果和在SQL Server中一样好。然而,在SQL Fiddle的Oracle中测试查询时,我得到了以下错误:
ORA-00935: group function is nested too deeply
如果有一个在Oracle有经验的人就这个特定的查询对它发表评论,那就太好了。同时,这里有一个替代方案(在Oracle中确实有效),其中分组被另一轮排名+检索排名靠前的行所取代:
SELECT
PDATE,
AC_NO,
BAL
FROM (
SELECT
PDATE,
AC_NO,
BAL,
ROW_NUMBER() OVER (PARTITION BY AC_NO, BAL, grp ORDER BY PDATE DESC) AS rnk
FROM (
SELECT
PDATE,
AC_NO,
BAL,
ROW_NUMBER() OVER (PARTITION BY AC_NO ORDER BY PDATE) -
ROW_NUMBER() OVER (PARTITION BY AC_NO, BAL ORDER BY PDATE) AS grp
FROM YourTable
) s
) s
WHERE rnk = 1
;
尝试
select max(pdate) as pdate,
ac_no,
bal
from your_table
group by ac_no, bal
select max(pdate),
ac_no,
bal
from dummy_table
group by ac_no, bal;