Выберите столбцы на основе разницы между двумя строками - PullRequest
0 голосов
/ 14 марта 2019

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

   +--------------+---------------+---------------+---------------+
   | avg_speed_p0 | avg_speed_p25 | avg_speed_p50 | avg_speed_p75 |
   +--------------+---------------+---------------+---------------+
1  |     85.15    |     87.23     |     84.16     |     85.44     |
2  |     78.63    |     82.76     |     78.01     |     83.15     |
   +--------------+---------------+---------------+---------------+

Где я вычислил среднюю скорость днем ​​(1) и ночью (2) из ​​большого количества автомобилей в пунктах с 25-метровым расстоянием между ними.

Я сделал таблицу, используя:

create table avg_speeds as
   select * from avg_speed_day
      union
   select * from avg_speed_night

Я попытался сделать первичный ключ как day и night с помощью:

alter table avg_speed_day add column time varchar

, а затем:

insert into avg_speed_day (time) values ('day')

но это не работает, а только дает мне:

   +--------------+---------------+---------------+---------------+--------+
   | avg_speed_p0 | avg_speed_p25 | avg_speed_p50 | avg_speed_p75 |  time  |
   +--------------+---------------+---------------+---------------+--------+
1  |     85.15    |     87.23     |     84.16     |     85.44     | [null] |
2  |     [null]   |     [null]    |     [null]    |     [null]    |   day  |
   +--------------+---------------+---------------+---------------+--------+

Я хотел бы получить таблицу, в которой вычисляется разница между днем ​​(1) и ночью (2), и отображается только один раз, когда разница больше 5.

Как это:

   +---------------+----------------+
   | diff_speed_p0 | diff_speed_p50 |
   +---------------+----------------+
1  |      6.52     |      6.15      |
   +---------------+----------------+

1 Ответ

0 голосов
/ 14 марта 2019

Ваши комментарии показывают, что вы получаете эти две строки из некоторых других таблиц или представлений.

Используйте их прямо так:

WITH day   AS (SELECT avg_speed_p0, avg_speed_p25, avg_speed_p50, avg_speed_p75
               FROM avg_speed_day),
     night AS (SELECT avg_speed_p0, avg_speed_p25, avg_speed_p50, avg_speed_p75
               FROM avg_speed_night)
SELECT CASE WHEN abs(day.avg_speed_p0 - night.avg_speed_p0) > 5
            THEN day.avg_speed_p0 - night.avg_speed_p0
       END AS avg_speed_p0,
       CASE WHEN abs(day.avg_speed_p25 - night.avg_speed_p25) > 5
            THEN day.avg_speed_p25 - night.avg_speed_p25
       END AS avg_speed_p25,
       CASE WHEN abs(day.avg_speed_p50 - night.avg_speed_p50) > 5
            THEN day.avg_speed_p50 - night.avg_speed_p50
       END AS avg_speed_p50,
       CASE WHEN abs(day.avg_speed_p75 - night.avg_speed_p75) > 5
            THEN day.avg_speed_p75 - night.avg_speed_p75
       END AS avg_speed_p75
FROM day CROSS JOIN night;

В SQL нет способа динамически опускать столбец.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...