Выберите данные на основе минимального значения - PullRequest
0 голосов
/ 28 февраля 2019

Я работаю над базой данных PostgreSQL с данными слежения за автомобилями, которые выглядят примерно так:

+--------+---------------------+-------+---------+------------+------------+
| car_id |       datetime      | trip  |  speed  |  hub1_dist |  hub2_dist |
+--------+---------------------+-------+---------+------------+------------+
|    1   | 2014-12-20 12:12:12 |   1   |    82   |     6.7    |     2.1    |
|    1   | 2014-12-20 12:12:13 |   1   |    81   |     3.5    |     4.4    |
|    1   | 2014-12-20 12:12:14 |   1   |    85   |     7.8    |     3.8    |
|    1   | 2014-12-20 17:42:51 |   2   |    82   |     4.2    |     5.4    |
|    1   | 2014-12-20 17:42:52 |   2   |    76   |     2.5    |     2.1    |
|    2   | 2014-12-21 09:24:24 |   3   |    80   |     4.5    |     6.7    |
|    2   | 2014-12-21 09:24:25 |   3   |    84   |     5.3    |     3.5    |
|    2   | 2014-12-21 09:24:26 |   3   |    83   |     8.2    |     5.1    |
+--------+---------------------+-------+---------+------------+------------+

Где у каждого автомобиля есть определенный car_id, и trip изменяется в зависимости от этого car_id или изменение datetime больше 5 сек.Для каждой точки данных регистрируется speed, и вычисляется расстояние до числа hubs

. Я хотел бы получить таблицу с отображением speed на основе кратчайшегорасстояние до каждого hub.Это должно выглядеть так:

+-------+------------------+------------------+
| trip  |    hub1_speed    |  speed_hubdist_2 |
+-------+------------------+------------------+
|   1   |        81        |        82        |
|   2   |        76        |        76        |
|   3   |        80        |        84        |
+-------+------------------+------------------+

Я сейчас использую:

SELECT trip, hub1_dist, speed
FROM (
  SELECT trip, hub1_dist, speed,
         MIN(hub1_dist) OVER (PARTITION BY trip) AS MIN_hub1_dist
  FROM data_base
) t
WHERE hub1_dist = MIN_hub1_dist

И это работает.Но в некоторых случаях у меня 50 hubs, поэтому я должен сделать это 50 раз.

1 Ответ

0 голосов
/ 28 февраля 2019

Я думаю, вы просто хотите агрегировать:

select trip, min(hub1_dist), min(hub2_dist), min(hub3_dist), . . . 
from data_base
group by trip;

Вам нужно ввести выражения для каждого столбца.Электронная таблица может помочь вам сгенерировать запрос.Или вы можете сделать что-то вроде этого:

select string_agg(replace('min(hub@n_dist) as hub@n_dist', '@n', gs.n::text), ', ')
from generate_series(1, 50, 1) gs(n)

РЕДАКТИРОВАТЬ:

Вы можете получить скорость для минимальных расстояний, используя функции массива:

select trip, min(hub1_dist),
       (array_agg(speed order by hub1_dist))[1] as speed_at_min1,
       min(hub2_dist),
       (array_agg(speed order by hub2_dist))[1] as speed_at_min2,
       min(hub3_dist),
       (array_agg(speed order by hub3_dist))[1] as speed_at_min3,
       . . . 
from data_base
group by trip;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...