したがって、あなたの問題は次のように言い換えることができるように思えます。
同じAC_NO
andを持つ連続する行のグループがある場合は常に、それらの最後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_NO
とBAL
が同一である連続する行のグループを決定します。したがって、そのようなグループはすべて、 および とともにグループを一意に識別する追加の属性を受け取り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
;