SQL-запрос с максимальной датой и несколькими условиями - PullRequest
0 голосов
/ 30 сентября 2018

Я должен посчитать все ордера, для которых для task_status установлено значение «FULFILLED».Конкретной задаче будет присвоено значение «ВЫПОЛНЕНО», если один ордер «УСПЕХ» или если пять ордеров со статусом «ПОПЫТКА».Я написал запрос, который использует максимальную дату, чтобы выбрать правильные заказы.Моя проблема в том, что запрос иногда учитывает (из-за той же даты, что и в таблице) один «ATTEMPT» в качестве причины для задачи «FULLFILLED», хотя фактическая причина - это один «SUCCESS» заказ.Мне нужен запрос, который предпочитает статус «УСПЕХ» (если он существует) из заказа, а не «ATTEMPT».

Спасибо за помощь и совет!

Это мой текущий запрос иПример двух заказов с похожей датой:

select *,
    case 
        when task_status = 'FULFILLED' and status = 'SUCCESS' and max(date) then '999'
        when task_status = 'FULFILLED' and status = 'ATTEMPT' and max(date) then '999'
        else '000'
    end as number
    from table
    group by task_id
    ;


   task_id  order   task_status status  date
    372     121     FULFILLED   INVALID 2018/06/26
    372     132     FULFILLED   ATTEMPT 2018/07/04
    372     145     FULFILLED   SUCCESS 2018/07/04

1 Ответ

0 голосов
/ 30 сентября 2018

Вы можете использовать подзапрос для получения количества записей для задачи, где статус равен 'ATTEMPT', и проверьте, по крайней мере, пять.Чтобы выбрать записи в правильном порядке, используйте row_number().Сначала на status по убыванию (потому что 'SUCCESS' > 'ATTEMPT'), а затем по дате, также по убыванию.Во внешнем SELECT получают только записи с номером строки, равным единице.

SELECT x.task_id,
       x.order,
       x.task_status,
       x.status,
       x.date
       FROM (SELECT t1.task_id,
                    t1.order,
                    t1.task_status,
                    t1.status,
                    t1.date,
                    row_number() OVER (PARTITION BY t1.task_id
                                       ORDER BY t1.status DESC,
                                                t1.date DESC) rn
                    FROM table t1
                    WHERE t1.task_status = 'FULFILLED'
                          AND (t1.status = 'SUCCESS'
                                OR t1.status = 'ATTEMPT'
                                   AND (SELECT count(*)
                                               FROM table t2
                                               WHERE t2.task_id = t1.task_id
                                                     AND t2.tast_status = t1.task_status
                                                     AND t2.status = t1.status) >= 5)) x
       WHERE x.rn = 1;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...