Сравнение двух одинаковых таблиц и указание максимальной даты - PullRequest
0 голосов
/ 05 декабря 2018

Мне было интересно, можно ли сравнивать даты в одной и той же таблице с одинаковым идентификатором *1001*, но суть в том, что есть дополнительный столбец, отображающий состояние.Например, вот таблица A:

Original Table


Я хотел бы увидеть следующие результаты:

Results

Я знаю, что мог бы использовать группирование и максимальное агрегирование с идентификатором, чтобы найти максимальную дату;Тем не менее, я хотел бы, чтобы столбец состояния (работает / остановлен) был там.Это мне очень поможет.

Ответы [ 2 ]

0 голосов
/ 05 декабря 2018

В случае Oracle вы можете использовать предложение KEEP следующим образом:

SELECT t.id,
       MAX(t.status) KEEP (DENSE_RANK LAST ORDER BY t."DATE") AS corresponding_status,
       MAX(t."DATE") AS last_date
  FROM tab t
 GROUP BY t.id
 ORDER BY 1

Для этого примера данных:

+----+---------+------------+
| ID | STATUS  | DATE       |
+----+---------+------------+
|  1 | Running | 2018-02-03 |
|  1 | Stopped | 2018-04-04 |
|  2 | Running | 2018-03-24 |
|  2 | Stopped | 2018-01-02 |
|  3 | Running | 2018-06-12 |
|  3 | Stopped | 2018-06-12 |
+----+---------+------------+

Это вернет этот результат:

+----+----------------------+------------+
| ID | CORRESPONDING_STATUS | LAST_DATE  |
+----+----------------------+------------+
|  1 | Stopped              | 2018-04-04 |
|  2 | Running              | 2018-03-24 |
|  3 | Stopped              | 2018-06-12 |
+----+----------------------+------------+

Как видно из этой SQL-скрипты .

Для случаев, когда у вас есть несколько записей в одной комбинации ID и DATE, онаЯ выберу одно значение STATUS - в данном случае последнее (на основе алфавитно-цифровой сортировки), как я использовал MAX на STATUS.Часть LAST ORDER BY t."DATE" соответствует тому, как мы выбираем DATE значение в группе, т.е. путем выбора последнего DATE в группе.

См. эту запись Oracle Docs для получения более подробной информации..

0 голосов
/ 05 декабря 2018

В большинстве баз данных самый быстрый метод (при условии правильных индексов) является коррелированным подзапросом:

select t.*
from t
where t.date = (select max(t2.date) from t t2 where t2.id = t.id);

Даже если он не самый быстрый, он должен работать в любой базе данных.

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