postgresql - Внутренний JOIN работает неправильно - PullRequest
0 голосов
/ 08 сентября 2018

У меня есть таблицы, которые выглядят так:

enter image description here

Я пытаюсь присоединиться к этим двум таблицам, чтобы получить что-то вроде этого:

        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;

Вот что я получаю:

enter image description here

Я не понимаю, что здесь происходит. Кажется, что были добавлены некоторые случайные дополнительные строки, но я понятия не имею, почему это происходит. В исходных таблицах всего 6 строк, но запрашиваемая таблица возвращает 10.

Не знаю, поможет ли эта информация, но это Hypertable 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');

1 Ответ

0 голосов
/ 08 сентября 2018

Ваш столбец времени не уникален.

Для 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;
...