0

ダミー テーブルから 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_NOandを持つ連続する行のグループがある場合常に、それらの最後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これらの 3 つの列を使用して行をグループ化し、 を取得するだけですMAX(PDATE)

私は、これが SQL Server と同じように Oracle でも機能することを期待していました。ただし、SQL Fiddle で Oracle でクエリをテストすると、次のエラーが発生しました

ORA-00935: group function is nested too deeply

この特定のクエリに関して、オラクルの経験者がコメントしてくれれば幸いです。一方、これは別の方法です (これは Oracle で機能します)。ここでは、グループ化がランキングのもう 1 つのラウンド + 上位の行の取得に置き換えられます。

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 に答える