Как получить только последние вступившие пары? - PullRequest
0 голосов
/ 09 июля 2019

У меня есть две таблицы, где вторая связана с первой несколькими записями (1:n).

В первой таблице есть записи для id_something (еще одна таблица, но пока не важная) и для каждого дня date_day.

+-----------+
| Table ONE |
+----+------+-------+----------+----------+
| id | id_something | date_day | created  |
+----+--------------+----------+----------+
|  1 |          666 | 2019-1-1 | 2019-1-1 |
|  2 |          666 | 2019-1-1 | 2019-7-7 |
|  3 |          123 | 2019-1-1 | 2019-1-1 |
+----+--------------+----------+----------+

Вторая таблица связана с этим id и содержит пары ключ-значение.

+-----------+
| Table TWO |
+--------+--+--+-----+
| id_one | foo | bar |
+--------+-----+-----+
|      1 |   1 |  20 |
|      1 |   2 |  21 |
|      2 |   1 |  30 |
|      2 |   2 |  31 |
|      2 |   3 |  32 |
|      3 |   1 |  10 |
+--------+-----+-----+

Я хочу запросить все возможные соединения, так просто, это JOIN:

SELECT *
FROM one
LEFT JOIN two
ON two.id_one = one.id;

+----+--------------+----------+----------+--------+-----+-----+
| id | id_something | date_day | created  | id_one | foo | bar |
+----+--------------+----------+----------+--------+-----+-----+
|  1 |          666 | 2019-1-1 | 2019-1-1 |      1 |   1 |  20 |
|  1 |          666 | 2019-1-1 | 2019-1-1 |      1 |   2 |  21 |
|  2 |          666 | 2019-1-1 | 2019-7-7 |      2 |   1 |  30 |
|  2 |          666 | 2019-1-1 | 2019-7-7 |      2 |   2 |  31 |
|  2 |          666 | 2019-1-1 | 2019-7-7 |      2 |   3 |  32 |
|  3 |          123 | 2019-1-1 | 2019-1-1 |      3 |   1 |  10 |
+----+--------------+----------+----------+--------+-----+-----+

Теперь, как вы видите, у меня также есть поле created. id_something в сочетании с date_day может быть таким же, но я хочу иметь только самые последние (created DESC) пары со второй таблицей.

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

+----+--------------+----------+----------+--------+-----+-----+
| id | id_something | date_day | created  | id_one | foo | bar |
+----+--------------+----------+----------+--------+-----+-----+
|  2 |          666 | 2019-1-1 | 2019-7-7 |      2 |   1 |  30 |
|  2 |          666 | 2019-1-1 | 2019-7-7 |      2 |   2 |  31 |
|  2 |          666 | 2019-1-1 | 2019-7-7 |      2 |   3 |  32 |
|  3 |          123 | 2019-1-1 | 2019-1-1 |      3 |   1 |  10 |
+----+--------------+----------+----------+--------+-----+-----+

Но я не могу заставить его работать ... Я пытался использовать DISTINCT или даже подзапрос и конструкцию case, но он либо не работает, либо является очень несовместимым. Группировка также не будет возвращать каждую объединенную пару, а только одну строку для каждого id из таблицы один.

Чего мне не хватает для достижения желаемого результата?

(если бы не использовался специфичный для Oracle синтакс, это был бы бонус.)

Ответы [ 2 ]

1 голос
/ 09 июля 2019

использовать row_number() взять самый последний id_something, а затем использовать объединение

select a.*,b.* from     
(
select *,
row_number()over(partition by id_something order by created desc) rn  from one
) a join two b ON b.id_one = a.id;
 where rn=1
1 голос
/ 09 июля 2019

Вы можете использовать аналитические функции:

SELECT *
FROM (SELECT o.* ROW_NUMBER() OVER (PARTITION BY id ORDER BY created DESC) as seqnum
      FROM one o
     ) o LEFT JOIN
     two t
     ON t.id_one = o.id
WHERE o.seqnum = 1;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...