ORACLE выберите запрос с заказом по случаю AS C и DESC - PullRequest
1 голос
/ 27 февраля 2020

У меня есть такие данные:

ID | FTIME                 | STATUS
1  | 2020-02-27 08:11:12   | C-in
1  | 2020-02-27 08:11:15   | C-in
1  | 2020-02-27 08:11:18   | C-in
1  | 2020-02-27 17:11:01   | C-out
1  | 2020-02-27 17:11:03   | C-out
1  | 2020-02-27 17:11:08   | C-out

Предположим, имя таблицы TBL_RECORD

Теперь мне нужны разные данные, чтобы получить данные только в этом случае ниже:

  1. Для статуса C -in, только получить данные по возрастанию, означает, что это будет 2020-02-27 08:11:12
  2. Для статуса C -out, только получить данные по убыванию, означает, что это будет 2020-02-27 17:11:08

Таким образом, результат будет:

ID | FTIME                  | STATUS
1  | 2020-02-27 08:11:12    | C-in
1  | 2020-02-27 17:11:08    | C-out

Я попробовал мой код ниже, но он не работает.

SELECT DISTINCT ID, FTIME, STATUS FROM TBL_RECORD ORDER BY (CASE STATUS
          WHEN 'C-in' THEN FTIME ASC
          WHEN 'C-out' THEN FTIME DESC
      END) DESC

Есть ли способ получить счастливый запрос?

Ответы [ 3 ]

1 голос
/ 27 февраля 2020

Вы не говорите, какая версия Oracle.

В Oracle 12.1 вы можете выполнить объединение между двумя SELECT с, которые ограничиваются 1 строкой.

Для Например:

(
  select *
  from tbl_record
  where status = 'C-in'
  order by ftime
  fetch next 1 rows only
)
union all (
  select *
  from tbl_record
  where status = 'C-out'
  order by ftime desc
  fetch next 1 rows only
)

РЕДАКТИРОВАТЬ ДЛЯ ORACLE 10 г :

В Oracle 10 г вы можете сделать:

select * 
from tbl_record 
where status = 'C-in'
  and ftime = (select min(ftime) from tbl_record where status = 'C-in')
   or status = 'C-out'
  and ftime = (select max(ftime) from tbl_record where status = 'C-out')
1 голос
/ 27 февраля 2020

Это будет работать для нескольких идентификаторов.

Если вы просто используете ID, FTIME и STATUS, функции GROUP будут работать хорошо. Если вы тянете другие столбцы, пожалуйста, дайте мне знать, и я покажу альтернативу, которая немного сложнее.

Чтобы получить самый старый по ID для C-in:

SELECT ID, STATUS, MIN(FTIME) AS OUT_FTIME
FROM TBL_RECORD
WHERE STATUS = 'C-in'
GROUP BY ID, STATUS;

Для получить новейший идентификатор для C-out:

SELECT ID, STATUS, MAX(FTIME) AS OUT_FTIME
FROM TBL_RECORD
WHERE STATUS = 'C-out'
GROUP BY ID, STATUS;

Чтобы собрать все вместе:

SELECT ID, STATUS, MIN(FTIME) AS OUT_FTIME
FROM TBL_RECORD
WHERE STATUS = 'C-in'
GROUP BY ID, STATUS
UNION SELECT ID, STATUS, MAX(FTIME) AS OUT_FTIME
FROM TBL_RECORD
WHERE STATUS = 'C-out'
GROUP BY ID, STATUS
ORDER BY ID, OUT_FTIME;
1 голос
/ 27 февраля 2020

Я думаю, мы должны ограничить количество записей в выводе, поэтому мы должны использовать group by вместо order by. Пожалуйста, попробуйте запрос ниже -

SELECT
    ID,
    (CASE STATUS WHEN 'C-in' THEN MIN(FTIME) ELSE MAX(FTIME) END) AS FTIME,
    STATUS
FROM TBL_RECORD
GROUP BY ID, STATUS;

Я думаю, вам нужен запрос ниже (Group by данные только по Status) -

SELECT
    (CASE STATUS WHEN 'C-in' THEN MIN(FTIME) ELSE MAX(FTIME) END) AS FTIME,
    STATUS
FROM TBL_RECORD
GROUP BY STATUS;

Если вам нужны данные только по ID = 1 тогда вам нужно добавить в запрос предложение Where, как показано ниже -

SELECT
    ID,
    (CASE STATUS WHEN 'C-in' THEN MIN(FTIME) ELSE MAX(FTIME) END) AS FTIME,
    STATUS
FROM TBL_RECORD
WHERE ID = 1
GROUP BY ID, STATUS;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...