如何解决用于连接两个表并仅显示具有最新时间戳的结果的 SQL 脚本?
假设我是一家银行:
我有一个表,其中包含一组名为 user_identity
的用户身份,另一个表是 user_balance
,其中包含用户曾经拥有的所有余额的列表。
每次用户从其帐户存款或取款时,都会在 user_balance
中创建一个新条目。每个条目都有以下字段:
-
timestamp
- 记录余额的日期 -
id
- 唯一标识符 -
userId
- 拥有帐户的用户的 ID -
amountCents
- 以美分计的余额 -
relatedTransferId
- 导致产生新余额的提款或存款的唯一标识符 -
prevIoUsBalanceId
- 之前余额的唯一标识符
我想写两个脚本:
- 返回当前存储在所有帐户中的所有资金的总和
- 返回所有用户及其当前余额的列表
这是我写第二篇的尝试:
SELECT
user_balance."amountCents" * (1/100) AS balance,"user"."identityId",user_identity."firstName",user_identity."lastName",user_balance.timestamp
FROM user_balance
JOIN user_identity
ON user_identity.id = user_balance."userId"
ORDER BY 1;
我不知道如何只为给定用户选择最近的余额。任何和所有的帮助将不胜感激!
user_balance
示例表(请注意每个用户 ID 可能有多个条目,因为每次余额变化时都会有一个条目!):
timestamp | userId | amountCents
--------------------------------+-----------------+--------------
2021-05-12 07:02:05.088+00:00 | u_2przr9gcn52sm | 20607
2021-05-12 17:08:05.552+00:00 | u_ysvzqzs7f862 | 0
2021-05-19 00:40:29.62+00:00 | u_y9eyf0j3b5i5 | 407454
2021-05-16 21:47:34.123+00:00 | u_jze8wwmuuudk | 66500
2021-05-14 08:01:03.929+00:00 | u_22cyb1sctel5k | 3881602
2021-05-17 05:01:02.711+00:00 | u_22cyb1sctel5k | 3435703
user_identity
示例表:
id | firstName | lastName
-------------------+----------------------------+----------------------
ui_104xy9vczsrmy | John | Doe
ui_10holeidg2ydt | John | Doe
ui_10no0d6mtvdfi | John | Doe
想要的结果:
firstName | lastName | currentBalance
-------------------+----------------------------+----------------------
John | Doe | 3000
John | Doe | 2000
John | Doe | 1000
(其中最终表中的 currentBalance
是与 user_balance
表中的最新时间戳相关联的余额)。
解决方法
您可以在表表达式上使用 ROW_NUMBER()
来标识您想要的行并排除其他行。
例如:
select
i.firstName,i.lastName,x.amountCents as currentBalance
from user_identity i
left join (
select b.*,row_number() over(partition by b.userId
order by b.timestamp desc) as rn
from user_balance b
) x on x.id = i.userId
where x.rn = 1
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。