Sql 从联接查询中获取每个查询的最新值 系统中大约有100项资产 每项资产都有许多购买行为 我想了解每项资产的最新购买情况
我尝试以下查询:Sql 从联接查询中获取每个查询的最新值 系统中大约有100项资产 每项资产都有许多购买行为 我想了解每项资产的最新购买情况,sql,postgresql,Sql,Postgresql,我尝试以下查询: CREATE TABLE asset ( asset_name VARCHAR(255) NOT NULL PRIMARY KEY ); CREATE TABLE asset_purchase ( asset_name VARCHAR(255) REFERENCES asset, purchase_value INT NOT NULL, purhcase_timestamp INT NOT NULL ); 但它只返回一个条目 SELE
CREATE TABLE asset (
asset_name VARCHAR(255) NOT NULL PRIMARY KEY
);
CREATE TABLE asset_purchase (
asset_name VARCHAR(255) REFERENCES asset,
purchase_value INT NOT NULL,
purhcase_timestamp INT NOT NULL
);
但它只返回一个条目
SELECT *
FROM
asset
JOIN asset_purchase USING (asset_name) ORDER BY purhcase_timestamp LIMIT 1;
,或
,或
,或(在PostgreSQL 9.3+中)
用
postgresql
重新标记为psql
应该用于解决工具的问题,而不是一般的Postgres问题。当然,它只返回一行:您已经告诉Postgres,使用LIMIT 1
非常感谢!我唯一能听懂的就是这一点。哪个性能更好?@samol:这取决于您的数据分布和索引。查询2和查询4基本相同,只是4是9.3及以上版本的首选语法。
SELECT *
FROM (
SELECT ap.*,
ROW_NUMBER() OVER (PARTITION BY a.asset_name ORDER BY purchase_timestamp DESC) rn
FROM asset a
LEFT JOIN
asset_purchase ap
ON ap.asset_name = a.asset_name
) q
WHERE rn = 1
SELECT (a).*, (ap).*
FROM (
SELECT asset.a,
(
SELECT ap
FROM asset_purchase ap
WHERE ap.asset_name = a.asset_name
ORDER BY
purchase_timestamp DESC
LIMIT 1
)
) q
SELECT DISTINCT ON (a.asset_name)
*
FROM asset a
LEFT JOIN
asset_purchase ap
ON ap.asset_name = a.asset_name
ORDER BY
a.asset_name, ap.purchase_timestamp DESC
SELECT *
FROM asset
LEFT JOIN
LATERAL
(
SELECT *
FROM asset_purchase ap
WHERE ap.asset_name = a.asset_name
ORDER BY
purchase_timestamp DESC
LIMIT 1
) ap
ON TRUE