SQL - объединение 3 таблиц и выбор новейшей записи в журнале для каждого идентификатора - PullRequest
2 голосов
/ 11 октября 2019

Я получил довольно сложную загадку, чтобы решить. Пока я не разблокирован.

Я получил 3 таблицы, к которым мне нужно присоединиться, чтобы получить результат.

Самое главное, что мне нужно самое большое h_id за p_id. h_id - уникальная запись в истории журнала. И мне нужен самый новый для данной точки (p_id -> num).

Помимо этого мне также нужны ext и name.

история

+----------------+---------+--------+
|     h_id       |  p_id   | str_id |
+----------------+---------+--------+
|     1          | 1       |  11    |
|     2          | 5       |  15    |
|     3          | 5       |  23    |
|     4          | 1       |  62    |
+----------------+---------+--------+

точка

+----------------+---------+
|     p_id       |  num    | 
+----------------+---------+
|     1          | 4564    | 
|     5          | 3453    |
+----------------+---------+

улица

+----------------+---------+-------------+
|     str_id     |  ext    |     name    |
+----------------+---------+-------------+
|     15         |         | Mein st. 33 | - bad name
|     11         |         | eck  st. 42 | - bad name
|     62         | abc     | Main st. 33 |
|     23         | efg     | Back st. 42 |
+----------------+---------+-------------+

ОЖИДАЕМЫЙ РЕЗУЛЬТАТ

+----------------+---------+-------------+-----+
|     num        |  ext    |     name    |h_id |
+----------------+---------+-------------+-----+
|     3453       | efg     | Back st. 42 | 3   |
|     4564       | abc     | Main st. 33 | 4   |
+----------------+---------+-------------+-----+

Я использую Oracle SQL. Попытка с использованием запроса ниже, но результат не соответствует действительности.

SELECT num, max(name), max(ext), MAX(h_id) maxm FROM history
INNER JOIN street on street.str_id = history._str_id
INNER JOIN point on point.p_id = history.p_id
GROUP BY point.num

1 Ответ

0 голосов
/ 11 октября 2019

В Oracle вы можете использовать keep:

SELECT p.num, 
       MAX(h.h_id) as maxm,
       MAX(s.name) KEEP (DENSE_RANK FIRST ORDER BY h.h_id DESC) as name,
       MAX(s.ext) KEEP (DENSE_RANK FIRST ORDER BY h.h_id DESC) as ext
FROM history h INNER JOIN
     street s
     ON s.str_id = h._str_id INNER JOIN
     point p
     ON p.p_id = h.p_id
GROUP BY p.num;

Синтаксис keep позволяет вам использовать "first ()" и "last ()" для агрегатов.

...