Как отсортировать с приоритетом и датами? - PullRequest
0 голосов
/ 01 мая 2018

У меня следующий запрос PostgreSQL.

SELECT id FROM table WHERE user_id=$user_id ORDER BY
    CASE
      WHEN (date_completed_utc='0000-00-00 00:00:00') THEN 0 ELSE 1 END ASC

Вот пример того, что в таблице:

enter image description here

date_requested_utc всегда является прошедшей датой.

date_completed_utc по умолчанию устанавливается на «0000-00-00 00:00:00», но позднее изменяется на дату, более новую, чем date_requested_utc .

То, что я пытаюсь сделать, это:

Если date_completed_utc является значением по умолчанию, то все эти строки будут выше всех остальных, но эти строки отсортированы по date_requested_utc по убыванию.

Но если date_completed_utc не является значением по умолчанию, поместите эти строки внизу и упорядочите эти строки на date_completed_utc по убыванию.

Результирующий порядок по идентификатору должен быть следующим:

26, 20, 18, 17, 15, 16, 27, 28

Я пробовал все эти различные операторы CASE, но, похоже, не могу понять это правильно.

Ответы [ 2 ]

0 голосов
/ 02 мая 2018

(Опубликован ответ от имени автора вопроса) .

Я изменил свой запрос на следующий, и теперь он работает нормально.

(SELECT id FROM table WHERE user_id=$user_id AND date_completed_utc='0000-00-00 00:00:00' ORDER BY date_requested_utc DESC)
UNION ALL
(SELECT id FROM table WHERE user_id=$user_id AND date_completed_utc!='0000-00-00 00:00:00' ORDER BY date_completed_utc DESC)
0 голосов
/ 01 мая 2018

Вы можете попробовать использовать двойные ордера.

SELECT id 
FROM table 
WHERE user_id=$user_id 
ORDER BY
    CASE WHEN (date_completed_utc='0000-00-00 00:00:00') THEN 0 ELSE 1 END,
    date_requested_utc DESC

EDIT

Я видел ваш вопрос для редактирования.

Вам не нужно использовать UNION ALL для объединения двух запросов, вы можете запросить один с помощью CASE WHEN выражения напрямую.

Order by номер

  1. 1/(EXTRACT(epoch from age(now(),date_requested_utc)) / 86400 date_requested_utc чем ближе время, тем больше число.
  2. 1/(EXTRACT(epoch from age(now(),date_completed_utc::timestamp)) / 86400)::numeric date_completed_utc чем ближе время, тем больше число.

Вы можете попробовать это.

SELECT id
SELECT id FROM table 
WHERE user_id=$user_id 
ORDER BY
    (
      CASE WHEN (date_completed_utc='0000-00-00 00:00:00') 
        THEN (EXTRACT(epoch from age(now(),'1970-01-01')) / 86400) + 1/(EXTRACT(epoch from age(now(),date_requested_utc)) / 86400)::numeric
        ELSE  1/(EXTRACT(epoch from age(now(),date_completed_utc::timestamp)) / 86400)::numeric
      END
    )::numeric 
    DESC

sqlfiddle: http://sqlfiddle.com/#!17/f5f88a/28

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