postgresql 在连接查询中按日期时间分组
postgresql group by datetime in join query
我的 postgresql timescaledb 数据库(版本 12.06)中有 2 个 tables,我尝试通过内部连接查询。
表的结构:
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;
基本上,它 returns currency_price table 中存在的所有行。我知道 postgres 不允许 select 列没有聚合函数或将它们包含在“group by”子句中。因此,如果我在 select 查询中不包含 dt 列,我会收到预期的结果,但如果我包含它,输出会显示每种货币每一天的行,而我只想拥有最大值每种货币,然后根据不同的日期过滤掉它们。
总的来说,我对 SQL 非常缺乏经验。
任何解决此问题的建议将不胜感激。
有多种方法可以做到,最简单的方法是使用 window 函数。
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
一般window函数:
https://www.postgresql.org/docs/9.5/functions-window.html
也适用于 SUM、AVG、MAX、MIN 等标准聚合函数。
一些示例:https://www.postgresqltutorial.com/postgresql-window-function/
我的 postgresql timescaledb 数据库(版本 12.06)中有 2 个 tables,我尝试通过内部连接查询。 表的结构:
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;
基本上,它 returns currency_price table 中存在的所有行。我知道 postgres 不允许 select 列没有聚合函数或将它们包含在“group by”子句中。因此,如果我在 select 查询中不包含 dt 列,我会收到预期的结果,但如果我包含它,输出会显示每种货币每一天的行,而我只想拥有最大值每种货币,然后根据不同的日期过滤掉它们。
总的来说,我对 SQL 非常缺乏经验。 任何解决此问题的建议将不胜感激。
有多种方法可以做到,最简单的方法是使用 window 函数。
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
一般window函数: https://www.postgresql.org/docs/9.5/functions-window.html 也适用于 SUM、AVG、MAX、MIN 等标准聚合函数。
一些示例:https://www.postgresqltutorial.com/postgresql-window-function/