Как получить значение из таблицы B, чья максимальная дата меньше даты в таблице A - PullRequest
1 голос
/ 18 марта 2020

У меня есть две таблицы; таблица A и таблица B. Таблица A имеет StoreNumber, MatNumber и Date. Таблица B имеет StoreNumber, MatNumber, Date и ShipmentValue. Я должен получить значение Отправления из таблицы B для StoreNumber и MatNumber, учитывая, что Максимальная дата в Таблице B для StoreNumber и MatNumber должна быть меньше, чем Дата для того же StoreNumber и MatNumber в Таблице A (каждая строка в Таблице A). Пожалуйста, смотрите выходную таблицу.

Таблица A:

StoreNumber MatNumber   Date
  A            9    3/30/2020
  A            9    3/30/2020
  B           10    3/18/2020
  B           10    3/18/2020
  A            9    3/13/2020

Таблица B:

StoreNumber MatNumber   Date    ShipmentValue
       A           9    3/10/2020   2
       A           9    3/12/2020   3
       A           9    3/18/2020   4
       B          10    3/4/2020    7
       B          10    3/7/2020    9
       B          10    3/16/2020   10

Выход:

StoreNumber MatNumber   A.Date  B.Date  ShipmentValue
       A           9    3/30/2020   3/18/2020   4
       A           9    3/30/2020   3/18/2020   4
       B          10    3/18/2020   3/16/2020   10
       B          10    3/18/2020   3/16/2020   10
       A           9    3/13/2020   3/12/2020   3

Ответы [ 2 ]

1 голос
/ 18 марта 2020

Пробовал с ROW_NUMBER и выбирал 1-ую строку после даты заказа по дес c.

SELECT  A.StoreNumber 
        ,A.MatNumber  
        ,A.Date 
        ,B.Date AS B_Date   
        ,B.ShipmentValue 
FROM    TableA A
LEFT JOIN 
        (
          SELECT  StoreNumber ,MatNumber  , Date   , ShipmentValue
          FROM 
              (
                SELECT ROW_NUMBER() OVER (PARTITION BY StoreNumber, MatNumber ORDER BY DATE DESC ) AS ID,* 
                FROM TableB
              ) A 
          WHERE ID = 1
         ) B
ON   A.StoreNumber  = B.StoreNumber
AND  A.MatNumber    = B.MatNumber
1 голос
/ 18 марта 2020

Это место, где удобно использовать боковое соединение :

select a.*, b.date, b.shipmentvalue
from a left join lateral
     (select b.*
      from b
      where b.storenumber = a.storenumber and
            b.matnumber = a.matnumber and
            b.date <= a.date
      order by b.date desc
      fetch first 1 row only
     ) b
     on 1=1;  -- returns rows in a even when there are no matches

РЕДАКТИРОВАТЬ:

Wow. Снежинка реализует боковые соединения, а затем ограничивает их фундаментальным образом. Другой метод более дорогой, но должен работать:

select ab.*, b.shipmentValue
from (select a.StoreNumber, a.MatNumber, a.Date, max(b.date) as b_date, b.shipmentvalue
      from a left join
           b 
           on b.storenumber = a.storenumber and
              b.matnumber = a.matnumber and
              b.date <= a.date
      group by a.StoreNumber, a.MatNumber, a.Date
     ) ab join
     b
     on b.storenumber = ab.storenumber and
        b.matnumber = ab.matnumber and
        b.date <= ab.b_date
...