选择"不同于多列"返回多列(所有列)PSQL



我正在尝试对 OHLC 数据进行不同的操作,其中每个符号有多个日期

我可以很好地完成操作本身,它只返回日期和符号

select distinct timestamp, symbol from mv_qs_facts group by mv_qs_facts.symbol, mv_qs_facts.timestamp;

但我希望它也返回所有列(附加:收盘、开盘、高、低、交易量(。

我的目标是返回最后一个非重复(时间戳、符号(

我有一个想法。

select distinct on (timestamp, symbol), close, open, high, low from mv_qs_facts group by mv_qs_facts.symbol, mv_qs_facts.timestamp;

我看这话没这句话那么容易。

我已经读到我也许可以用子查询、临时表或连接来解决它(所有这些都不使用不同(。

使用DISTINCT ON ()

SELECT DISTINCT ON (timestamp, symbol)
timestamp, symbol, close, open, high, low
FROM mv_qs_facts;

这将返回closeopenhigh和群中随机成员的low

如果要控制使用哪个成员,请添加ORDER BY子句,然后采用此顺序中的第一个成员。

如果问题是客户端上的内存消耗,则应使用游标:

BEGIN;
DECLARE c CURSOR FOR SELECT ...;
FETCH 100 FROM c;
FETCH 100 FROM c;
...
COMMIT;

这是您的查询。

select distinct t1.* from (
select row_number() over (partition by symbol order by timestamp desc) as rn, * from 
mv_qs_facts) as t1
where t1.rn = 1

我添加了 id,因为我最初将时间戳和日期作为我的复合键,但事实证明重复的日期很糟糕,我需要一些参考来排序

CREATE materialized view temp AS  
SELECT DISTINCT ON (symbol, timestamp)
id, timestamp, symbol, close, open, high, low
FROM qs_facts order by symbol, timestamp, id desc;

最新更新