相关疑难解决方法(0)

Postgres DISTINCT与DISTINCT ON

我有一个使用以下语句创建的Postgres表.此表由另一个服务的数据转储填充.

CREATE TABLE data_table (
    date date DEFAULT NULL,
    dimension1 varchar(64) DEFAULT NULL,
    dimension2 varchar(128) DEFAULT NULL
) TABLESPACE pg_default;
Run Code Online (Sandbox Code Playgroud)

我正在构建的ETL中的一个步骤是提取它们的唯一值dimension1并将它们插入另一个中间表中.但是,在某些测试中,我发现下面的2个命令不会返回相同的结果.我希望两者都返回相同的金额.与第二个命令相比,第一个命令返回的结果更多(1466行与1504行相比).

-- command 1
SELECT DISTINCT count(dimension1)
FROM data_table;

-- command 2    
SELECT count(*)
FROM (SELECT DISTINCT ON (dimension1) dimension1
FROM data_table
GROUP BY dimension1) AS tmp_table;
Run Code Online (Sandbox Code Playgroud)

有什么明显的解释吗?作为解释的替代方案,是否有任何建议检查我应该做的数据?

编辑:以下查询都返回1504(与"简单"相同DISTINCT)

SELECT count(*)
FROM data_table WHERE dimension1 IS NOT NULL;

SELECT count(dimension1)
FROM data_table;
Run Code Online (Sandbox Code Playgroud)

谢谢!

sql postgresql

14
推荐指数
1
解决办法
6021
查看次数

PostgreSQL:获取每个时间间隔的最新行

我有下表。它存储为 TimescaleDB 超表。数据速率为每秒 1 行。

CREATE TABLE electricity_data
(
    "time" timestamptz NOT NULL,
    meter_id integer REFERENCES meters NOT NULL,
    import_low double precision,
    import_normal double precision,
    export_low double precision,
    export_normal double precision,
    PRIMARY KEY ("time", meter_id)
)
Run Code Online (Sandbox Code Playgroud)

我想获取一段时间内给定时间间隔内的最新行。例如上一年每个月的最新记录。以下查询可以工作,但速度很慢:

EXPLAIN ANALYZE
SELECT
DISTINCT ON (bucket)
time_bucket('1 month', "time", 'Europe/Amsterdam') AS bucket,
import_low,
import_normal,
export_low,
export_normal
FROM electricity_data
WHERE meter_id = 1
AND "time" BETWEEN '2022-01-01T00:00:00 Europe/Amsterdam' AND '2023-01-01T00:00:00 Europe/Amsterdam'
ORDER BY bucket DESC
Run Code Online (Sandbox Code Playgroud)
Unique  (cost=0.42..542380.99 rows=200 width=40) (actual time=3654.263..59130.398 rows=12 loops=1)
  -> …
Run Code Online (Sandbox Code Playgroud)

sql postgresql datetime timescaledb

3
推荐指数
1
解决办法
514
查看次数

标签 统计

postgresql ×2

sql ×2

datetime ×1

timescaledb ×1