【问题标题】:select distinct from multiple columns return multiple columns (all columns) PSQL从多列中选择不同返回多列(所有列)PSQL
【发布时间】:2019-09-02 01:57:07
【问题描述】:

我正在尝试对每个符号有多个日期的 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)来解决它。

【问题讨论】:

    标签: postgresql distinct


    【解决方案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;
    

    【讨论】:

    • 谢谢。我有超过 200 万条记录,但内存不足。 :...( 我希望在 psql vs r 中执行此操作以避免内存问题,但我发现我仍然有它们。
    • 我将它降低到 1 个相同的结果。有没有办法按符号分区/分组然后进行操作
    • 这似乎不太可能。请详细说明:什么组件内存不足?错误信息是什么? PostgreSQL 日志中是否有内存上下文转储?
    • 错误:查询结果内存不足
    • 关键字为“查询结果”。我敢打赌,将结果保存在内存中的问题是客户端。尝试使用游标,一次只获取几个结果。
    【解决方案2】:

    这是您的查询。

    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
    

    【讨论】:

    • error "select row_number() over (partition by s.symbol, order by ti..." with order by... 我能够在没有顺序的情况下运行子查询(或其他任何名称) by 和 s.symbol(即只是符号),例如“选择 row_number() over (partition by symbol) as rn, timestamp, symbol from mv_qs_facts”。整个命令有效“select t1.symbol, t1.timestamp from (select row_number () over (partition by symbol) as rn, timestamp, symbol from mv_qs_facts) as t1 where t1.rn = 1" 检查它现在是否有效。它仍然只返回符号和时间戳。我原来的命令是这样做的
    • 更新,删除了partition和order by之间的逗号
    • 添加 order by 以仅获取最新时间戳,但这取决于您。
    • 查询运行。但只返回 2 col 符号和时间戳。我的原始查询“从 mv_qs_facts 组中选择不同的时间戳,符号 mv_qs_facts.symbol, mv_qs_facts.timestamp;”做同样的事情。我想要做的是返回开盘、高点、低点、收盘、成交量列。我怀疑我可以在某处添加这些列?
    • 我认为您需要再次加入该表的 ID 以获取其他列。
    【解决方案3】:

    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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多