Найти минимальное значение на основе конкретного параметра в Oracle - PullRequest
0 голосов
/ 07 мая 2018

Мне нужно написать запрос, который выбирает самый ранний час на основе столбца AIRCRAFTREG.Когда найден самый ранний час, он будет отмечен цифрой «1», а другой (не первый полет) - «0» в столбце FIRST_FLIGHT.Вот мой запрос:

select MIN(TO_CHAR(SCHEDULED_DEPDT_LC, 'DD-MM-YY HH24:MI')) SCHED_DEP,
       AIRCRAFTREG, 
       CASE WHEN MIN(TO_CHAR(SCHEDULED_DEPDT_LC, 'DD-MM-YY HH24:MI')) 
                 IN (TO_CHAR(SCHEDULED_DEPDT_LC, 'DD-MM-YYYY HH24:MI')) 
       THEN 1 ELSE 0 END FIRST_FLIGHT
from DBODSXML4OPS.XML4OPS
where STATUS IN ('Scheduled') 
  and SERVICETYPE IN ('J','G') 
  and ACTUAL_BLOCKOFF_LC is not null 
  and ACTUAL_BLOCKON_LC is not null 
  and (ACTUAL_BLOCKON_LC-SCHEDULED_ARRDT_LC)*24*60 > '+000000015 00:00:00.000000000' 
  and (ACTUAL_BLOCKOFF_LC-SCHEDULED_DEPDT_LC)*24*60 > '+000000015 00:00:00.000000000' 
  and TO_CHAR(SCHEDULED_DEPDT_LC, 'yyyy-mm-dd') BETWEEN '2018-05-02' and '2018-05-02'
group by AIRCRAFTREG, SCHEDULED_DEPDT_LC
order by AIRCRAFTREG;

Результат:

+----------------+-------------+--------------+
|   SCHED_DEP    | AIRCRAFTREG | FIRST_FLIGHT |
+----------------+-------------+--------------+
| 02-05-18 14:25 | PK-GAA      |            0 |
| 02-05-18 16:55 | PK-GAI      |            0 |
| 02-05-18 12:50 | PK-GAJ      |            0 |
| 02-05-18 14:40 | PK-GAJ      |            0 |
| 02-05-18 16:05 | PK-GAJ      |            0 |
+----------------+-------------+--------------+

Ожидаемый:

+----------------+-------------+--------------+
|   SCHED_DEP    | AIRCRAFTREG | FIRST_FLIGHT |
+----------------+-------------+--------------+
| 02-05-18 14:25 | PK-GAA      |            1 |
| 02-05-18 16:55 | PK-GAI      |            1 |
| 02-05-18 12:50 | PK-GAJ      |            1 |
| 02-05-18 14:40 | PK-GAJ      |            0 |
| 02-05-18 16:05 | PK-GAJ      |            0 |
+----------------+-------------+--------------+

Ответы [ 2 ]

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

Во-первых, у вас есть опечатка, вы сравниваете YYYY char с YY в выборе.

Во-вторых, я думаю, вам нужно будет выполнить подзапрос в операторе CASE, чтобы найти min (sched_dep) для кода aircraftreg (это было бы некрасиво, хотя есть лучший способ).

Группировка по методу не позволяет сканировать все остальные строки для сравнения (только одну строку).

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

Я думаю, вам нужна аналитическая версия функции MIN вместо запроса GROUP BY.
Простой пример (демо: http://sqlfiddle.com/#!4/bb331/3)

SELECT SCHED_DEP,
       AIRCRAFTREG,
       CASE WHEN SCHED_DEP =
            min( SCHED_DEP ) OVER (partition by AIRCRAFTREG )
       THEN 1 ELSE 0 END as FIRST_FLIGHT
FROM Table1
-- WHERE your where conditions are here
order by AIRCRAFTREG, SCHED_DEP

|             SCHED_DEP | AIRCRAFTREG | FIRST_FLIGHT |
|-----------------------|-------------|--------------|
| 2018-02-05 14:25:00.0 |      PK-GAA |            1 |
| 2018-02-05 16:55:00.0 |      PK-GAI |            1 |
| 2018-02-05 12:50:00.0 |      PK-GAJ |            1 |
| 2018-02-05 14:40:00.0 |      PK-GAJ |            0 |
| 2018-02-05 16:05:00.0 |      PK-GAJ |            0 |
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...