我正在编写一个程序来查询 Oracle 中的一些数据并将其分组:
Account Amt Due Last payment Last Payment Date (mm/dd/yyyy format)
1234 10.00 5.00 12/12/2013
1234 35.00 8.00 12/12/2013
3293 15.00 10.00 11/18/2013
4455 8.00 3.00 5/23/2013
4455 14.00 5.00 10/18/2013
我想对数据进行分组,所以每个账户只有一条记录,应付金额和最后一笔付款相加。除非最后付款日期不同——如果日期不同,那么我只想要最后付款。所以我想得到这样的结果:
Account Amt Due Last payment Last Payment Date
1234 45.00 13.00 12/12/2013
3293 15.00 10.00 11/18/2013
4455 22.00 5.00 10/18/2013
我在做类似的事情
select Account, sum (AmtDue), sum (LastPmt), Max (LastPmtDt)
from all my tables
group by Account
但是,这对上面的最后一条记录不起作用,因为最后一次付款只是 10 月 18 日的 $5.00,而不是 10 月 18 日的总和。
如果我按 Account 和 LastPmtDt 分组,那么我会得到最后两条记录,但每个账户我只想要一条。
我还有其他要查询的数据,并且我在另一个字段上使用了 CASE、INSTR 和 LISTAGG(如果将它们组合给我这个子字符串和那个,则输出“两者”;否则如果它只给我这个子串,然后输出子串;否则如果它只给我另一个子串,那么输出那个)。看起来我可能需要类似的东西,但不是通过寻找特定日期。如果日期相同,则 sum (LastPmt) 和 max (LastPmtDt) 工作正常,如果它们不相同,那么我想忽略除了最近的 LastPmt 和 LastPmtDt 记录之外的所有记录。
哦,我的 LastPmt 和 LastPmtDt 字段已经是选择中的 case 语句。它们不是我已经可以访问的字段。我正在阅读有关 RANK 和 KEEP 的其他帖子,但要涉及这两个领域,我还需要对每个领域进行所有计算。查询所有内容,然后围绕它包装另一个查询以执行分组、求和和选择我想要的字段是否更有效?
相关:HAVING - GROUP BY to get the latest record
有人可以就如何解决这个问题提供一些指导吗?
最佳答案
试试这个:
select Account,
sum ( Amt_Due),
sum (CASE WHEN Last_Payment_Date = last_dat THEN Last_payment ELSE 0 END),
Max (Last_Payment_Date)
from (
SELECT t.*,
max( Last_Payment_Date ) OVER( partition by Account ) last_dat
FROM table1 t
)
group by Account
关于sql - 在 Oracle 中选择分组集中的最新数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20790123/