【问题标题】:postgresql - Inner JOIN is not working correctlypostgresql - 内部联接无法正常工作
【发布时间】:2018-09-08 11:29:30
【问题描述】:

我的表格如下所示:

我正在尝试对这两个表进行 INNER JOIN,这样我会得到这样的结果:

        time         | block_height | differential_pressure |
---------------------+--------------+-----------------------+
 2018-09-08 11:14:10 |         83.7 |                286.84 |
 2018-09-08 11:14:10 |         83.6 |                282.14 |
 2018-09-08 11:14:11 |         83.4 |                298.35 |
 2018-09-08 11:14:12 |         83.1 |                298.23 |
 2018-09-08 11:14:12 |         82.9 |                294.76 |
 2018-09-08 11:14:13 |         82.7 |                288.37 |

但是当我运行以下查询时:

SELECT * FROM rt_block_height 
INNER JOIN rt_differential_pressure 
ON rt_block_height.time = rt_differential_pressure.time;

这是我得到的:

我不明白这里发生了什么。似乎添加了一些随机的附加行,但我不知道它为什么会发生。原表只有6行,但查询表返回10。

我不知道这些信息是否有帮助,但这是一个 TimescaleDB 超表。这是创建表的源代码:

CREATE TABLE IF NOT EXISTS public.rt_BLOCK_HEIGHT
(
"time" timestamp without time zone,
BLOCK_HEIGHT double precision
)
WITH (
OIDS = FALSE
)
TABLESPACE pg_default;

ALTER TABLE public.rt_BLOCK_HEIGHT
OWNER to postgres;
SELECT create_hypertable('rt_BLOCK_HEIGHT', 'time');

【问题讨论】:

标签: postgresql inner-join timescaledb


【解决方案1】:

您的时间列不是唯一的。

对于2018-09-08 11:14:10 时间戳,您有:

block_heightA = 83.7
block_heightB = 83.6
differential_pressureA = 286.84
differential_pressureB = 282.14

因此,当您进行连接时,您将获得两个 2 元素集的笛卡尔积:

2018-09-08 11:14:10 block_heightA differential_pressureA
2018-09-08 11:14:10 block_heightA differential_pressureB
2018-09-08 11:14:10 block_heightB differential_pressureA
2018-09-08 11:14:10 block_heightB differential_pressureB

要获得您想要的结果,您必须决定如何处理每个时间戳的重复值。例如你可以计算平均值:

SELECT
  grouped_block_height.time,
  avg_block_height,
  avg_differential_pressure
FROM (
  SELECT time, avg(block_height) as avg_block_height
  FROM rt_block_height
  GROUP BY time
) as grouped_block_height 
INNER JOIN (
  SELECT time, avg(differential_pressure) as avg_differential_pressure
  FROM rt_differential_pressure
  GROUP BY time
) as grouped_differential_pressure
ON grouped_block_height.time = grouped_differential_pressure.time;

【讨论】:

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