所以在我看来,你的问题可能被重新声明是这样的:
每当有与同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中工作只需as well as it did in SQL Server。然而,在SQL小提琴,I got this error测试Oracle中的查询时:
ORA-00935: group function is nested too deeply
将是巨大的,如果有人经历了甲骨文对它发表了评论关于这个特定的查询。同时,这里是一个替代(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
;
只是可以肯定,你不希望看到的平衡的变化,只是“我最后一次有这种平衡”?即今天的1200平衡,昨天1100和前一天1200,您不希望在2天前看到价值,因为您今天有相同的余额? –
我必须检查平衡变化,但是如果平衡从15日到23日二月相同,生病不得不取得与23日二日行 – nightWatcher
所以在我的例子,你会想要3行作为结果? –