使用每个帐户的最新日期的所有帐户的值总和

时间:2019-07-03 21:00:36

标签: mysql sql

随着时间的推移,帐户的价值会有所不同。我想知道该帐户拥有数据的最近日期的所有帐户的价值。

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 个答案:

答案 0 :(得分:2)

有多种实现方式,我更可取的方式是进行自我连接,如下所示:

sqlstring.replace(variable,variable)

答案 1 :(得分:1)

首先按帐户分组以获得每个帐户的最长时间,然后加入表格:

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

您也可以使用“不存在”来做到这一点:

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

请参见demo
结果:

> | totalvalue |
> | ---------: |
> |        105 |

答案 2 :(得分:1)

您要汇总日期是该帐户的最大日期的那些行的值:

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;

答案 3 :(得分:0)

做类似

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

答案 4 :(得分:0)

我喜欢为此使用相关子查询:

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

尤其是,这可以利用accounts(account, date)上的索引。