所以在我看来你的问题可以这样重新陈述:
每当有一组具有相同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_NO
和BAL
位置相同。因此,每个这样的组都会收到一个附加属性,该属性与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
;