随着时间的推移,帐户的价值会有所不同。我想知道该帐户拥有数据的最近日期的所有帐户的价值。
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是每个帐户最近日期的值。
答案 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)
上的索引。