Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 从联接查询中获取每个查询的最新值 系统中大约有100项资产 每项资产都有许多购买行为 我想了解每项资产的最新购买情况_Sql_Postgresql - Fatal编程技术网

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