如何通过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;