Нахождение самого последнего контракта для каждого аккаунта - PullRequest
0 голосов
/ 27 апреля 2018

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

account date    value
123456  4/20/2017   5
123456  1/20/2017   10
987654  2/5/2018    15
987654  12/31/2017  20
456789  4/27/2018   50
456789  1/24/2018   60

Я бы хотел получить значение 4/20/2017 для 123456, значение 2/5/2018 для 987654 и значение 4/27/2018 для 456789.

Спасибо за любую помощь

Ответы [ 2 ]

0 голосов
/ 27 апреля 2018

Так же, как альтернатива ответу Тима, другой вариант - использовать агрегатную функцию с keep (dense_rank first ...) или last:

select account, max(date_col) as max_date,
  max(value) keep (dense_rank last order by date_col) as value_from_max_date
from your_table
group by account;

который с вашими образцами данных, предоставленными в CTE (и изменяя имя столбца данных на что-то допустимое), дает тот же результат:

with your_table (account, date_col, value) as (
            select 123456, date '2017-04-20', 5 from dual
  union all select 123456, date '2017-01-20', 10 from dual
  union all select 987654, date '2018-02-05', 15 from dual
  union all select 987654, date '2017-12-31', 20 from dual
  union all select 456789, date '2018-04-27', 50 from dual
  union all select 456789, date '2018-01-24', 60 from dual
)
select account, max(date_col) as max_date,
  max(value) keep (dense_rank last order by date_col) as value_from_max_date
from your_table
group by account;

   ACCOUNT MAX_DATE   VALUE_FROM_MAX_DATE
---------- ---------- -------------------
    123456 2017-04-20                   5
    456789 2018-04-27                  50
    987654 2018-02-05                  15

Если у вас есть много столбцов для включения из этой целевой строки, тогда это становится грязным, а другой подход проще; но в некоторых отношениях это яснее для этой ситуации (ИМО).

0 голосов
/ 27 апреля 2018

Использование ROW_NUMBER:

SELECT account, "date", "value"
FROM
(SELECT 
  account, "date", "value",
  ROW_NUMBER() OVER (PARTITION BY account ORDER BY "date" DESC) rn
 FROM yourTable
) t
WHERE rn=1;

Обратите внимание, что удаленного ответа, данного @NiVeR, было бы достаточно, если бы мы только хотели установить максимальную дату для каждой учетной записи. Если нам также нужно значение или вообще другие столбцы из каждой записи, то нам потребуется выполнить дополнительное объединение или использовать номер строки, как я это делал выше.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...