【问题标题】:postgresql group by datetime in join querypostgresql 在联接查询中按日期时间分组
【发布时间】:2021-06-09 15:17:54
【问题描述】:

我的 postgresql timescaledb 数据库(版本 12.06)中有 2 个表,我尝试通过内部联接进行查询。 表结构:

CREATE TABLE currency(
    id serial PRIMARY KEY,
    symbol TEXT NOT NULL,
    name TEXT NOT NULL,
    quote_asset TEXT
); 

CREATE TABLE currency_price (
    currency_id integer NOT NULL,
    dt timestamp WITHOUT time ZONE NOT NULL,
    open NUMERIC NOT NULL,
    high NUMERIC NOT NULL,
    low NUMERIC NOT NULL,
    close NUMERIC,
    volume NUMERIC NOT NULL,
    PRIMARY KEY (
        currency_id,
        dt
    ),
    CONSTRAINT fk_currency FOREIGN KEY (currency_id) REFERENCES currency(id)
);

我要查询的是:

SELECT currency_id AS id, symbol, MAX(close) AS close, DATE(dt) AS date
FROM currency_price
JOIN currency ON
currency.id = currency_price.currency_id
GROUP BY currency_id, symbol, date
LIMIT 100;

基本上,它返回currency_price 表中存在的所有行。我知道 postgres 不允许选择没有聚合函数或将它们包含在“group by”子句中的列。因此,如果我的选择查询中不包含 dt 列,我会收到预期的结果,但如果包含它,输出会显示每种货币每一天的行,而我只想获得每种货币的最大值和之后根据不同的日期将它们过滤掉。

总的来说,我对 SQL 非常缺乏经验。 任何解决此问题的建议将不胜感激。

【问题讨论】:

  • 你好。你能添加一些数据样本吗?最好在小提琴中
  • 我没有得到最后一位,你想得到最大值(关闭)值和最大值的日期,对吧?
  • 是的,完全正确。它改为显示每一行。仍在尝试在小提琴上创建一些示例数据。
  • 我可能会推荐使用第一个/最后一个函数,如下所示:youtu.be/okB3tcXsQB0 & youtu.be/w5dbC_iM4oE
  • 示例数据链接:sqlfiddle.com/#!17/0455a/17@Jim /跨度>

标签: postgresql timescaledb


【解决方案1】:

有几种方法可以做到这一点,最简单的一种是使用窗口函数。

select * 
  from (
     SELECT currency_id,symbol,close,dt
           ,row_number() over(partition by currency_id,symbol
                                  order by close desc,dt desc) as rr
       FROM currency_price
       JOIN currency ON currency.id = currency_price.currency_id
      where dt::date = '2021-06-07'
       )q1 
 where rr=1

一般窗口函数: https://www.postgresql.org/docs/9.5/functions-window.html 也适用于 SUM、AVG、MAX、MIN 等标准聚合函数。

一些例子:https://www.postgresqltutorial.com/postgresql-window-function/

【讨论】:

  • 是的,这似乎确实有效,不过,我需要一个查询来检查我自己指定的日期内的价格峰值。我试图调整你给出的查询,但我对窗口函数不是很熟悉,所以它没有显示我的期望。此处的最后一个查询:sqlfiddle.com/#!17/0455a/25 未显示任何结果。
  • 哦,这可以满足我的需要!非常感谢您对此进行调查并提供帮助。 @LongBeard_Boldy,您能否提供一些链接,让我可以了解更多关于窗口函数的信息?似乎是查询数据的好方法。
猜你喜欢
  • 1970-01-01
  • 2016-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多