首页 > 解决方案 > 用于查找所有不同行的 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 查询,并且花了很多时间试图弄清楚如何做到这一点而迷失了方向。任何帮助将不胜感激。

标签: sqlpostgresql

解决方案


使用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子句的第一行(基于指定键之后的排序)。


推荐阅读