0

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

4

3 回答 3

2

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

每当有一组具有相同AC_NO和的连续行时BAL,仅返回其中的最后一个,其中连续最后一个都暗示按 排序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_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
;
于 2012-10-08T11:26:09.110 回答
1

尝试

select max(pdate) as pdate,
       ac_no,
       bal
from your_table
group by ac_no, bal
于 2012-10-08T10:03:44.797 回答
0
select max(pdate),
       ac_no,
       bal
from dummy_table
group by ac_no, bal;
于 2012-10-08T10:04:04.080 回答