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

时间:2012-10-08 10:01:16

标签: sql oracle

从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,但它们不起作用。

3 个答案:

答案 0 :(得分:2)

所以在我看来你的问题可以像这样重新陈述:

  

每当有一组具有相同AC_NOBAL的连续行时,只返回其中的最后一行,其中连续最后< / 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_NOBAL相同的连续行组。因此,每个此类组都会收到一个附加属性,该属性与AC_NOBAL一起唯一标识该组,然后您只需使用这三列对行进行分组并获取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;