Возвратить значение по нескольким условиям в соответствии с хронологией
Всем доброго! Уважаемые форумчане есть след. данные:
CREATE TEMPORARY TABLE matches
(
id int,
match_date timestamp,
team int,
score int
);
INSERT INTO matches(id, match_date, team, score)
VALUES
(578890, '2017-05-13 17:30:00.000', 8, 0),
(578903, '2017-05-13 15:00:00.000', 456, 0),
(578897, '2017-05-12 22:30:00.000', 3, 0),
(578884, '2017-05-08 20:00:00.000', 88, 0),
(578783, '2017-05-08 17:30:00.000', 456, 0),
(578766, '2017-05-07 22:00:00.000', 1, 0),
(578883, '2017-05-07 19:30:00.000', 18, 0),
(578861, '2017-04-23 15:00:00.000', 15, 1),
(578860, '2017-04-22 22:00:00.000', 9, 0),
(578864, '2017-04-22 19:30:00.000', 7, 3),
(578858, '2017-04-22 19:30:00.000', 72, 3),
(578750, '2017-04-22 17:00:00.000', 1, 2),
(578865, '2017-04-21 20:00:00.000', 773, 0),
(578871, '2017-04-16 20:30:00.000', 8086, 0),
(578850, '2017-04-16 20:00:00.000', 2, 2),
(578767, '2017-04-16 18:00:00.000', 456, 1),
(578869, '2017-04-16 15:30:00.000', 448, 2),
(578867, '2017-04-15 22:30:00.000', 18, 0),
(578868, '2017-04-15 20:00:00.000', 88, 1),
(578873, '2017-04-15 17:30:00.000', 3, 0),
(578872, '2017-04-15 12:00:00.000', 8, 1),
(578741, '2017-04-10 17:30:00.000', 456, 2),
(578843, '2017-04-10 15:00:00.000', 15, 2),
(578849, '2017-04-09 22:00:00.000', 7, 0),
(578848, '2017-04-09 19:30:00.000', 77, 1);
ЗАДАЧА:
(pgsql!) Необходимо возвратить количество очков команды за прошедшие 5 игр. Поясню: 1) расставляем данные в хронологическом порядке; 2) делаем выборку 1-но значение = 0, а остальные 4 значения > 0 (но расставлены они должны быть в хрон. порядке)
SELECT id, match_date, team, score
FROM matches
WHERE 'В колонке score должны появиться 5 строк, где появиться 1-но значение 0 и 4 значения > 0 отсортированные в хронологическом порядке.'
GROUP BY id
ORDER BY match_date DESC
LIMIT 5
Пожалуйста подскажите
Желаемый результат:

Ответы (1 шт):
Приблизительно так:
SELECT id, match_date, team, score FROM (
(SELECT *, 1 sortby FROM matches
where score = 0
ORDER BY match_date desc
limit 1)
union all
(SELECT *, 2 sortby FROM matches
where score != 0
ORDER BY match_date desc
limit 4)
) m
order by sortby, match_date desc
UNION ALL объединяет результаты двух запросов как множества и как следствие не гарантирует, что объединение будет отсортировано. Для того, чтобы отсортировать результат нужен явный ORDER BY. Если есть возможность отсортировать по какому-то существующему полю (либо по выражению), то можно использовать его. Если же такого поля нет (или выражение по которому можно отсортировать громоздкое), то можно добавить искусственное поле и по нему сортировать. Как я и сделал в этом примере - а именно добавил поле sortby и каждой записи в первом запросе назначил значение 1, а каждой записи во втором запросе значение 2, так что про сортировке по полю sortby результаты первого запроса в UNION ALL будут всегда выше чем второго.