samol
samol

Reputation: 20580

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.
  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

Upvotes: 0

Views: 29

Answers (1)

Quassnoi
Quassnoi

Reputation: 425371

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+)

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

Upvotes: 1

Related Questions