Как объединить две таблицы с максимальным значением не больше, чем другое значение столбца - PullRequest
1 голос
/ 20 декабря 2011

Извиняюсь за запутанный заголовок вопроса, но я не совсем уверен, как описать проблему.

У меня есть две таблицы в Oracle 9i:

Pricing
-------
SKU
ApplicableTime
CostPerUnit

Inventory
---------
SKU
LastUpdatedTime
NumberOfUnits

Pricing содержит пошаговые обновления стоимости каждого конкретного элемента SKU в определенное время Unix.Например, если у меня есть записи:

SKU    ApplicableTime    CostPerUnit
------------------------------------
12345  1000              1.00
12345  1500              1.50

, то позиция 12345 составляет 1,00 долл. США за единицу в любое время между 1000 и 1500 и 1,50 долл. США в любое время после 1500.

Inventoryсодержит SKU, время последнего обновления и количество единиц.

Я пытаюсь создать запрос таким образом, чтобы для каждой строки в Inventory я соединил две таблицы на основе SKU и нашелсамое большое значение для Pricing.ApplicableTime, которое НЕ больше Inventory.LastUpdatedTime, получить CostPerUnit этой конкретной записи из Pricing и вычислить TotalCost = CostPerUnit * NumberOfUnits:

SKU    TotalCost
-----------------------------------------------------------------------------------
12345  (CostPerUnit at most recent ApplicableTime <= LastUpdatedTime)*NumberOfUnits
12346  <same>
...    ...

Как бы я это сделал

Ответы [ 2 ]

2 голосов
/ 20 декабря 2011
SELECT * 
FROM
  (select  p.SKU,
  p.ApplicableTime,
  p.CostPerUnit*i.NumberOfUnits as cost,
  row_number over (partition by p.SKU order by p.ApplicableTime desc) as rnk
  from Pricing p
  join  
  Inventory i on (p.sku = i.sku and i.LastUpdatedTime > p.ApplicableTime)
  )
where rnk=1
1 голос
/ 20 декабря 2011
select SKU, i1.NumberOfUnits * p1.CostPerUnit as TotalCost
from Inventory i1, 
join (
    select SKU, max(ApplicableTime) as ApplicableTime, max(i.LastUpdatedTime) as LastUpdatedTime
    from Pricing p
    join Inventory i on p.sku = i.sku
    where p.ApplicableTime < i.LastUpdatedTime
    group by SKU
) t  on i1.sku = t.sku and i1.LastUpdatedTime = t.LastUpdatedTime
join Pricing p1 on p1.sku = t.sku and p1.ApplicableTime = t.ApplicableTime
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...