Сумма значений для всех учетных записей, использующих самую последнюю дату для каждого - PullRequest
0 голосов
/ 04 июля 2019

Учетные записи имеют различные значения с течением времени.Я хочу знать, какова стоимость всех учетных записей на самую последнюю дату, для которой у учетной записи есть данные.

Account      Date     Value
Account 1    1/1/19   12
Account 1    1/3/19   32
Account 1    1/12/19  52
Account 2    4/1/18   123
Account 2    4/22/18  42
Account 3    2/1/19   11
Account 3    7/1/18   64
Account 3    8/12/18  74

Для этого набора данных я хочу, чтобы мой конечный результат был 105, потому что 52 + 42 +11 - значения на самую последнюю дату для каждой учетной записи.

Ответы [ 5 ]

2 голосов
/ 04 июля 2019

Есть несколько способов сделать это, мой предпочтительный способ состоит в том, чтобы сделать самосоединение, как это:

select Account, Date, Value
from accounts as a inner join (
    select Account, max(Date) as maxDate
    from accounts
    group by Account
) as t on a.Account = t.Account and a.Date = t.maxDate
1 голос
/ 04 июля 2019

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

select sum(value)
from mytable
where (account, date) in (select account, max(date) from mytable group by account);

Начиная с MySQL 8, вы должны иметь возможность использовать оконную функцию, чтобы избежать чтения таблицыдважды:

select sum(value)
from
(
  select value, date = max(date) over (partition by account) as is_latest_for_account
  from mytable
)
where is_latest_for_account;
1 голос
/ 04 июля 2019

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

select sum(t.value) totalvalue
from tablename t inner join (
  select account, max(date) date
  from tablename
  group by account
) g on g.account = t.account and g.date = t.date

Вы также можете сделать это с NOT EXISTS:

select sum(t.value) totalvalue
from tablename t 
where not exists (
  select 1 from tablename
  where account = t.account and date > t.date
)

См. демо .Результат:

> | totalvalue |
> | ---------: |
> |        105 |
0 голосов
/ 04 июля 2019

Мне нравится использовать коррелированный подзапрос для этого:

select a.*
from accounts a
where a.date = (select max(a2.date)
                from accounts a2
                where a2.account = a.account
               );

В частности, это может использовать индекс на accounts(account, date).

0 голосов
/ 04 июля 2019

сделать что-то вроде

select max(date), account
from table
group by account

, это должно дать вам самую последнюю дату, связанную с каждой учетной записью.Затем вы можете создать CTE и присоединиться к нему по учетной записи и дате.как то так.

with q as (
  select max(date), account
  from table
  group by account
) select t1.account, t1.date, t1.value  
  from table t1 
  join q on t1.account = q.account and t1.date = q.date
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...