2012-10-08 25 views
0

从dummy_table中选择pdat,ac_no,bal;有关获取不同余额的Oracle SQL帮助

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

+0

只是可以肯定,你不希望看到的平衡的变化,只是“我最后一次有这种平衡”?即今天的1200平衡,昨天1100和前一天1200,您不希望在2天前看到价值,因为您今天有相同的余额? –

+0

我必须检查平衡变化,但是如果平衡从15日到23日二月相同,生病不得不取得与23日二日行 – nightWatcher

+0

所以在我的例子,你会想要3行作为结果? –

回答

1

尝试

select max(pdate) as pdate, 
     ac_no, 
     bal 
from your_table 
group by ac_no, bal 
+0

不,它不起作用:( – nightWatcher

+1

@nightWatcher我认为你需要更清楚一点,错误的结果?不运行?它返回的结果是什么? t显示出来吗?在您提供的测试数据上进行的快速测试(用“your_table”替换为“dummy_table”)似乎完全返回您想要的结果 –

+0

它显示了数据集1,在我的问题中询问了三行。 – nightWatcher

0
select max(pdate), 
     ac_no, 
     bal 
from dummy_table 
group by ac_no, bal; 
2

所以在我看来,你的问题可能被重新声明是这样的:

每当有与同AC_NOBAL一组连续的行,只返回最后一个,其中连续最后暗示,按照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_NOBAL一起唯一标识该组,然后您只需使用这三列对行进行分组即可得到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 
;