选择与多个列不同的返回多个列(所有列)PSQL

时间:2019-09-02 01:57:07

标签: postgresql distinct

我正在尝试对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)来解决它。

3 个答案:

答案 0 :(得分:1)

使用DISTINCT ON ()

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

这将为该组中的随机成员返回closeopenhighlow

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

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

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

答案 1 :(得分:0)

这是您的查询。

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

答案 2 :(得分:0)

added 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;