我有一张 table :
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 function ,理论上应该在处理行时增量计算,因此它应该在大型数据集上提供一些性能提升:
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
关于sql - 在主键字段中选择具有最大值的行的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26503947/