SQL - 2 Выбирает сразу.Союз не работает, как ожидалось - PullRequest
0 голосов
/ 26 мая 2019

У меня есть таблица с рейсами в Лондон. Каждое соединение имеет свой конкретный идентификатор. Каждый день может быть несколько записей с разными ценами для каждого идентификатора. Я ищу максимальную стоимость соединения на каждый день + средняя цена ЛЮБОГО рейса в Лондон каждый день.

Это мой запрос:

SELECT entryDate, MAX(totalPrice) AS totalPrice
FROM flights
WHERE connectionID = 'xyz123'
GROUP BY entryDate
UNION ALL 
SELECT entryDate, AVG(totalPrice) AS averagePrice
FROM flights
WHERE destination = 'London'
GROUP BY entryDate
ORDER BY entryDate ASC 
LIMIT 90

Это результат:

entryDate      totalPrice
2019-05-16     1159.8462
2019-05-16     553.0000
2019-05-17     1164.5736
2019-05-17     553.0000
2019-05-18     1101.8872
2019-05-18     634.0000
2019-05-19     1081.9766
2019-05-19     634.0000
2019-05-20     1119.6250
2019-05-20     634.0000
2019-05-21     1074.5781
2019-05-22     1079.2923
2019-05-23     1060.1641
2019-05-24     1116.1550

Обратите внимание, что в последние 4 дня (21 ~ 24) результат от MAX (totalPrice) был недоступен, поскольку конкретное соединение xyz123 не было в работе.

В любом случае, я намерен получить такой результат:

entryDate      totalPrice      averagePrice
2019-05-16     553.0000        1159.8462
2019-05-17     553.0000        1164.5736
2019-05-18     634.0000        1101.8872
2019-05-19     634.0000        1081.9766
2019-05-20     634.0000        1119.6250

1 Ответ

0 голосов
/ 26 мая 2019

Использовать условную агрегацию:

SELECT entryDate,
       MAX(CASE WHEN connectionID = 'xyz123' THEN totalPrice END) AS totalPrice,
       AVG(CASE WHEN destination = 'London' THEN totalPrice END) as averagePrice
FROM flights f
GROUP BY entryDate;

Если вы хотите только дни с обоими значениями:

SELECT entryDate,
       MAX(CASE WHEN connectionID = 'xyz123' THEN totalPrice END) AS totalPrice,
       AVG(CASE WHEN destination = 'London' THEN totalPrice END) as averagePrice
FROM flights f
WHERE connectionID = 'xyz123' OR
      destination = 'London'
GROUP BY entryDate
HAVING SUM( connectionID = 'xyz123' ) > 0 AND
       SUM( destination = 'London' ) > 0;

Оставьте предложение HAVING, если вы удовлетворены только одним значением на дату.

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