从dummy_table中选择pdat,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,但它们不起作用。
答案 0 :(得分:2)
所以在我看来你的问题可以像这样重新陈述:
每当有一组具有相同
AC_NO
和BAL
的连续行时,只返回其中的最后一行,其中连续和最后< / em>暗示按PDATE
排序。
以下是我在SQL Server中解决此问题的方法:
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 as well as it did in SQL Server中使用。但是,在SQL Fiddle,I got this error:
中测试Oracle中的查询时ORA-00935: group function is nested too deeply
如果有经验的Oracle对此特定查询发表了评论,那就太棒了。同时,这里有一个替代方案(which does work in 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
;
答案 1 :(得分:1)
尝试
select max(pdate) as pdate,
ac_no,
bal
from your_table
group by ac_no, bal
答案 2 :(得分:0)
select max(pdate),
ac_no,
bal
from dummy_table
group by ac_no, bal;