SUM строк с максимальной датой

125
13

Надеюсь, ты поможешь мне с этим. Предположим, у меня есть таблица, которая выглядит так (извините, но моя репутация недостаточно высока, чтобы отправлять изображения):

[ACCOUNT] [PROGRAM] [DATE] [AMOUNT]

[500] [P1] [10/10/2014] [4.2]
[500] [P2] [09/08/2010] [5.1]
[501] [P1] [08/02/2010] [2.3]
[501] [P3] [10/11/2014] [9.2]

Теперь, группируя по счету, я хочу суммировать суммы, сохраняя при этом программу, относящуюся к последней дате. Я хочу достичь этого, в Oracle SQL:

[ACCOUNT] [PROGRAM] [AMOUNT]

[500] [P1] [9.3]
[501] [P3] [11.5]

Может, кто-нибудь протянет мне руку, пожалуйста? Большое спасибо!

спросил(а) 2021-01-25T10:49:07+03:00 4 месяца, 2 недели назад
1
Решение
99

Это очень распространенная проблема, о которой никто не имеет большого ответа: "Покажите мне другие столбцы в строках, соответствующие моим критериям min()/max()". Если это большой стол и показатели производительности, ничто не может коснуться подхода, который я изложил здесь и здесь. Пытаться:

select account
, program = substr(val, 9)
, date = to_date(substr(val, 1, 8))
, amount
from ( select account
, amount = sum(amount)
, val = max(to_char(date, 'YYYYMMDD') + program) --latest date plus other data you want glued together in a sortable string
from yourtable
group by account) t

Мои извинения, если мой синтаксис Oracle выключен - я парень T-SQL.

ответил(а) 2021-01-25T10:49:07+03:00 4 месяца, 2 недели назад
45

Попробуй это:

SELECT a.account, b.program, a.amount FROM
(SELECT account, SUM(amount) as amount from table) a INNER JOIN
(SELECT account, program FROM table t
WHERE NOT EXISTS (
SELECT * FROM table
WHERE account = t.account and date > t.date)) b
ON a.account = b.account

или это может также работать:

SELECT t.account, t.program, t.amount 
FROM
(SELECT account, program, SUM(AMOUNT) OVER (PARTITION BY account, program), date
FROM table) t
WHERE NOT EXISTS
(SELECT* from table
WHERE account = t.account and date > t.date) b

ответил(а) 2021-01-25T10:49:07+03:00 4 месяца, 2 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема