繁体   English   中英

在主键字段中选择具有最大值的行的最快方法

[英]Fastest way to select row with max value at primary key field

我有一张桌子:

CREATE TABLE spots(
    datetime TIMESTAMP,
    market VARCHAR(15),
    spot NUMERIC(10, 5),
    PRIMARY KEY (market, datetime)
);

我需要选择一行p_market与最大值datetime ,该申请是小于或等于p_datetime ,所以我有两个选择采用这样的:

SELECT * FROM spots WHERE market = p_market AND datetime = (
    SELECT MAX(datetime) FROM spots WHERE market = p_market AND datetime <= p_datetime
);

SELECT * FROM spots WHERE market = p_market AND datetime <= p_datetime
ORDER BY datetime DESCENDING LIMIT 1;

因此,问题是-从性能角度来看哪个变体更好。

Postgres支持window函数 ,从理论上讲,应该在处理行时以递增方式计算它,因此它应该在大型数据集上提供一些性能提升:

SELECT * 
FROM   (SELECT *,
               RANK() OVER (ORDER BY datetime DESC) AS rk
        FROM   spots
        WHERE  market = p_market AND datetime <= p_datetime) t
FROM   spots 
WHERE  rk = 1

暂无
暂无

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

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