简体   繁体   English

来自联接查询的最新消息

[英]The latest of each from a join query

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
);
  1. There are about 100 assets in the system. 系统中大约有100个资产。
  2. There are many purchases for each assets. 每个资产有许多购买。
  3. I want to get the latest purchase of each asset 我想获取每种资产的最新购买

I try the below query: 我尝试以下查询:

SELECT * 
FROM 
asset 
JOIN asset_purchase USING (asset_name) ORDER BY purhcase_timestamp LIMIT 1;

But it only returns one entry 但它只返回一个条目

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

, or , 要么

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

, or , 要么

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

, or (in PostgreSQL 9.3+) ,或(在PostgreSQL 9.3+中)

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM