微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

用于连接两个表并仅显示具有最新时间戳的结果的 SQL 脚本?

如何解决用于连接两个表并仅显示具有最新时间戳的结果的 SQL 脚本?

假设我是一家银行:

我有一个表,其中包含一组名为 user_identity用户身份,另一个表是 user_balance,其中包含用户曾经拥有的所有余额的列表。

每次用户从其帐户存款或取款时,都会在 user_balance 中创建一个新条目。每个条目都有以下字段:

  1. timestamp - 记录余额的日期
  2. id - 唯一标识符
  3. userId - 拥有帐户的用户的 ID
  4. amountCents - 以美分计的余额
  5. relatedTransferId - 导致产生新余额的提款或存款的唯一标识符
  6. prevIoUsBalanceId - 之前余额的唯一标识符

我想写两个脚本:

  1. 返回当前存储在所有帐户中的所有资金的总和
  2. 返回所有用户及其当前余额的列表

这是我写第二篇的尝试:

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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?