有关获取不同余额的Oracle SQL帮助



从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_NOBAL的连续行时,只返回其中的最后一行,其中连续最后都表示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_NOBAL相同的连续行组。因此,每个这样的组都会接收一个额外的属性,该属性与AC_NOBAL一起唯一地标识该组,然后您只需要使用这三列来对行进行分组并获得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;

最新更新