如何通过SQL上的第二个表属性筛选表
我有一个名为如何通过SQL上的第二个表属性筛选表,sql,datetime,filter,Sql,Datetime,Filter,我有一个名为lines的表,它用datetime注册了每个账户中的每笔交易。除了交易金额,该表还包含该账户在给定时间的余额。该行在事务发生时用小时(datetime)注册日期,并在创建该行时注册日期时间(created\u at) 因此,lines表如下所示: id | account_id | amount | balance | datetime | created_at 1 | ac1 | 5 | 13 | 2020-
lines
的表,它用datetime
注册了每个账户中的每笔交易。除了交易金额,该表还包含该账户在给定时间的余额。该行在事务发生时用小时(datetime
)注册日期,并在创建该行时注册日期时间(created\u at
)
因此,lines表如下所示:
id | account_id | amount | balance | datetime | created_at
1 | ac1 | 5 | 13 | 2020-03-24 08:57:31.195993 | 2020-03-24 08:57:31.195993
2 | ac1 | 3 | 10 | 2020-03-24 08:57:31.195993 | 2020-03-24 08:57:30.195993
3 | ac1 | 5 | 5 | 2020-03-24 06:54:31.195993 | 2020-03-24 06:57:31.195993
4 | ac2 | 6 | 11 | 2020-03-23 08:57:31.195993 | 2020-03-23 08:57:31.195993
4 | ac2 | 0 | 5 | 2020-03-23 07:57:31.195993 | 2020-03-23 07:57:31.195993
5 | ac3 | 6 | 13 | 2020-03-24 08:57:31.195993 | 2020-03-24 08:57:31.195993
我想得到每个账户每天最后一笔交易的余额。
值得一提的是,对于账户
,有时有两个行
具有相同的日期时间
,在这种情况下,我希望在
日期时间创建具有较高的行。
因此,我希望我的输出是:
id | account_id | amount | balance | date | datetime
1 | ac1 | 5 | 13 | 2020-03-24 | 2020-03-24 08:57:31.195993
4 | ac2 | 6 | 11 | 2020-03-23 | 2020-03-23 08:57:31.195993
5 | ac3 | 6 | 13 | 2020-03-24 | 2020-03-24 08:57:31.195993
我通过大量的内部连接成功地做到了这一点,但是查询速度太慢了
SELECT DATE(lines.datetime) as date, lines.account_id as account, lines.balance as balance
FROM lines
INNER JOIN (
SELECT DATE(a.datetime) date, a.account_id, MAX(a.created_at) created_at
FROM lines a
INNER JOIN (
SELECT b.account_id, DATE(b.datetime) date, MAX(b.datetime) datetime
FROM lines b
GROUP BY b.account_id, DATE(b.date)
) b ON a.account_id = b.account_id AND a.datetime = b.datetime
GROUP BY DATE(a.datetime), a.account_id
) c ON lines.account_id = c.account_id AND DATE(lines.datetime) = c.date AND lines.created_at = c.created_at
我知道一定有更好的方法,只是我自己找不到:(
我想得到每个账户每天最后一笔交易的余额
使用窗口功能:
select l.*
from (select l.*,
row_number() over (partition by account, date(datetime) order by datetime desc, created_at desc) as seqnum
from lines l
) l
where seqnum = 1;