Получить запись на максимальную дату каждого месяца - PullRequest
0 голосов
/ 06 ноября 2018

Я хочу получать остатки клиентов на максимальную дату каждого месяца, каждый год в базе данных. Таблица сальдо имеет сальдо в конце каждого дня, когда клиент совершает транзакцию. Я просто хочу выбрать баланс на максимальную дату каждого месяца. Любая помощь ??

Ниже приведен фрагмент моего набора данных.

enter image description here

Ответы [ 3 ]

0 голосов
/ 06 ноября 2018

Вы можете использовать самостоятельное соединение для вызова за столом cust_balances:

select c1.*
  from cust_balances c1
join 
(  
  select max("date") max_date
    from cust_balances
   group by to_char("date",'yyyymm')  
) c2 on ( c1."date" = c2.max_date );

Демонстрация SQL Fiddle

0 голосов
/ 06 ноября 2018

Вы можете сделать это также без подзапроса:

WITH b(ID, "date",bal) AS
  (
   SELECT 'CUST_I',DATE '2013-07-27', 14777.44 FROM dual UNION ALL
   SELECT 'CUST_H',DATE '2013-07-26', 71085.13 FROM dual UNION ALL
   SELECT 'CUST_I',DATE '2013-08-27', 66431.35656 FROM dual UNION ALL
   SELECT 'CUST_H',DATE '2013-08-26', 63102.68622 FROM dual UNION ALL
   SELECT 'CUST_H',DATE '2013-08-20', 6310.68622 FROM dual UNION ALL
   SELECT 'CUST_H',DATE '2013-08-10', 630.68622 FROM dual UNION ALL
   SELECT 'CUST_G',DATE '2013-09-25', 89732.04889 FROM dual UNION ALL
   SELECT 'CUST_E',DATE '2013-09-23', 83074.70822 FROM dual 
  )
SELECT ID,  
    MAX("date") KEEP (DENSE_RANK FIRST ORDER BY "date" desc) AS MAX_DATE,
    MAX(bal) KEEP (DENSE_RANK FIRST ORDER BY "date" desc) AS MAX_BAL
FROM b
GROUP BY ID, TRUNC("date", 'MM');

+-----------------------------+
|ID    |MAX_DATE  |MAX_BAL    |
+-----------------------------+
|CUST_E|23.09.2013|83074.70822|
|CUST_G|25.09.2013|89732.04889|
|CUST_H|26.07.2013|71085.13   |
|CUST_H|26.08.2013|63102.68622|
|CUST_I|27.07.2013|14777.44   |
|CUST_I|27.08.2013|66431.35656|
+-----------------------------+
0 голосов
/ 06 ноября 2018

Вы можете попробовать использовать оконную функцию - row_number ()

select * from
(
SELECT *,row_number() over(partition by extract(YEAR FROM Date), extract(MONTH FROM Date) order by date desc) as rn
FROM t
)rn=1
...