ИСПОЛЬЗУЯ МАКСИМАЛЬНЫЙ ИДЕНТИФИКАТОР и левое соединение - PullRequest
0 голосов
/ 12 декабря 2018

Вот мои таблицы

Таблица A

+-------------------+
| FILL_ID   COPY_ID |
+-------------------+
| 1         1       |
| 2         1       |
| 3         1       |
| 4         2       |
| 5         2       |
+-------------------+

Таблица B

+---------------------------------+
| SHIP_ID   Fill_ID    Shipdate   |
+---------------------------------+
| 1         1          1/1/18     |
| 2         2          2/1/18     |
| 3         4          5/1/18     |
| 4         5          6/1/18     |
+---------------------------------+
Я хочу, чтобы результаты запроса были
+--------------------------------+
| COPY_ID  FILL_ID    SHIPDATE   |
+--------------------------------+
| 1        3        Null         |
| 2        5        6/1/18       |
+--------------------------------+

Одна из моих попыток

SELECT A.COPY_ID,
  MAX(A.FILL_ID),
  B.SHIPDATE
FROM A
LEFT B
ON A.FILL_ID             = B.FILL_ID
GROUP BY A.COPY_ID,
  B.UPDATED_AT

Но с учетом вышеизложенного я получаю все идентификаторы заполнения

+--------------------------------+
| COPY_ID  FILL_ID    SHIPDATE   |
+--------------------------------+
| 1        1           1/1/18    |
| 1        2           2/1/18    |
| 1        3           Null      |
| 2        4           5/1/18    |
| 2        5           6/1/18    |
+--------------------------------+  

Я пробовал так много разных способов, чтобы заставить это работать, сортировка по убыванию с rownum = 1 и далее ина.

Ответы [ 4 ]

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

В Oracle вы можете использовать функциональность keep для получения последнего значения, используя group by:

select a.copy_id, max(a.fill_id),
       max(b.shipdate) keep (dense_rank first order by a.fill_id desc nulls first) as shipdate
from a left join
     b
     on b.fill_id = a.fill_id
group by a.copy_id;
0 голосов
/ 12 декабря 2018
select c.copy_id, c.fill_id, b.shipdate
from (
     select copy_id, max(fill_id) fill_id
     from A
     group by copy_id
     ) c
left join B on c.fill_id = b.fill_id
0 голосов
/ 12 декабря 2018

Один вариант будет использовать max(a.fill_id) over (partition by a.copy_id order by a.fill_id desc)
(, где a - псевдоним для TableA):

  select copy_id, fill_id, Shipdate
    from
    (
    with TableA( fill_id, copy_id) as
        (
         select 1,1 from dual union all
         select 2,1 from dual union all
         select 3,1 from dual union all
         select 4,2 from dual union all
         select 5,2 from dual
        ),
        TableB( ship_id, fill_id, Shipdate) as
        (
         select 1,1,date'2018-01-01' from dual union all
         select 2,2,date'2018-01-02' from dual union all
         select 3,4,date'2018-01-05' from dual union all
         select 4,5,date'2018-01-06' from dual 
        )
     select a.copy_id, a.fill_id, b.Shipdate, 
            max(a.fill_id) over (partition by a.copy_id order by a.fill_id desc)
            as max_ship
       from TableA a
       full outer join TableB b on a.fill_id = b.fill_id
    )
     where fill_id = max_ship;

COPY_ID FILL_ID SHIPDATE
------- ------- --------------------
   1       3    NULL
   2       5    06.01.2018 00:00:00

Вышеприведенный запрос упрощен для уже существующегоТаблицы как:

  select copy_id, fill_id, Shipdate
    from
    (
     select a.copy_id, a.fill_id, b.Shipdate, 
            max(a.fill_id) over (partition by a.copy_id order by a.fill_id desc)
            as max_ship
       from TableA a
       full outer join TableB b on a.fill_id = b.fill_id
    )
     where fill_id = max_ship;

Rextester Demo

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

Предполагая, что fill_id уникален в tableb.Следующие могут быть использованы.

with max_fill
  as (
select copy_id,max(fill_id) as max_fill_id
  from tablea
 group by copy_id
      )
   select a.copy_id
         ,a.max_fill_id
         ,b.shipdate
     from max_fill a
left join tableb b
   on a.max_fill_id=b.fill_id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...