【问题标题】:How to join two tables with max value not greater than another value of column如何连接最大值不大于列的另一个值的两个表
【发布时间】:2011-12-20 07:36:12
【问题描述】:

对令人困惑的问题标题表示歉意,但我不确定如何描述手头的问题。

我在 Oracle 9i 中有两个表:

Pricing
-------
SKU
ApplicableTime
CostPerUnit

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

Pricing 包含在特定 Unix 时间对每个特定 SKU 项目成本的增量更新。例如,如果我有记录:

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

,那么项目 12345 在 1000 到 1500 之间的任何时间为每单位 1.00 美元,在 1500 之后的任何时间为每单位 1.50 美元。

Inventory 包含 SKU、上次更新时间和单位数量。

我要做的是构造一个查询,以便对于 Inventory 中的每一行,我根据 SKU 加入两个表,我发现 Pricing.ApplicableTime 的最大值不大于 Inventory.LastUpdatedTime ,从Pricing获取该特定记录的CostPerUnit,并计算TotalCost = CostPerUnit * NumberOfUnits

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

我该怎么做?

【问题讨论】:

    标签: sql database oracle


    【解决方案1】:
    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
    

    【讨论】:

      【解决方案2】:
      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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-09-26
        • 1970-01-01
        • 2021-09-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-09-15
        • 1970-01-01
        相关资源
        最近更新 更多