Возвратить значение по нескольким условиям в соответствии с хронологией

Всем доброго! Уважаемые форумчане есть след. данные:

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 шт):

Автор решения: Roman Konoval

Приблизительно так:

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 будут всегда выше чем второго.

→ Ссылка