sql - 用于查找所有不同行的 SQL 查询,这些行的最近日期与单独列中的相同值相关联
问题描述
我正在使用 PostgreSQL,我有 3 个表:客户端、资产、余额。客户表有客户信息,每个客户都有一个client_id。资产表包含每个资产 ID 的“代码”。余额表有列:'client_id'、'asset_id'、'timestamp'、'amount'。
我有兴趣查询给定 client_id 的最新余额。“最近余额”是指获取最新的时间戳,以及每个资产的代码和金额,所有这些都与相关的 client_id 相关联。问题是,并非所有资产都同时更新。如果是这样,那么如果我想要 client_id = 3 的最新余额,我可以简单地做这样的事情:
select ticker, timestamp, amount
from balance inner join asset on asset_id = asset.id
and timestamp = (select max(timestamp)
from balance
where client_id = 3);
如果所有资产都已针对表中的每个新添加内容进行了更新(无论更改如何),这将起作用,从而导致所有资产具有相同的最新时间戳。但是,由于我不想更新未更改资产的余额,因此它不再起作用。如果我添加新内容,例如为客户增加一项特定资产的数量,因此该时间戳现在是与该客户端关联的所有时间戳的最新时间戳,则上面的查询将仅返回该单一资产,而不是全部与客户端关联的资产,因为它查找“最大(时间戳)”
如何更改上述查询以查找给定客户端 ID 的最大时间戳 PER 资产?
如果这令人困惑,我深表歉意,我从来都不擅长 SQL 查询,并且花了很多时间试图弄清楚如何做到这一点而迷失了方向。任何帮助将不胜感激。
解决方案
使用distinct on
:
select distinct on (client_id) ticker, timestamp, amount
from balance b inner join
asset a
on b.asset_id = a.asset.id
order by client_id, timestamp desc;
distinct on
是一个非常方便的 Postgres 扩展。它为括号中的键返回一行。该行是基于order by
子句的第一行(基于指定键之后的排序)。
推荐阅读
- node.js - Kubernetes nginx-ingress 在 Express 中如何处理路由
- nginx - 如何使用子域服务器名配置代理
- php - Laravel BelongsTo 关系在部署后不起作用,但它在本地机器上工作
- javascript - TypeError:无法设置未定义的属性“员工”
- reactjs - 基于动态路由渲染 React 组件
- c - 是否可以通过分配内存来恢复秘密数据(例如用于解密的空闲内存中的 RSA 私钥)?
- c - 为什么我的结构中的变量会发生变化?
- javascript - 控制 v-for 项目的定位
- design-patterns - 如何在颤振/飞镖中绘制弹出布局?
- c - 如何从 typedef 创建一个静态结构