找到加入最新日期的方法?

时间:2013-05-22 19:22:18

标签: sql join

对不起,我甚至不确定如何标题这个问题,所以希望我能描述一下。

我正在尝试使用连接或子查询进行查询,而不是单击。我的大脑一分钟变得越来越模糊。

所以,我有一张每个项目按日销售的表格。

然后我有一张表格,其中包含该项目与销售相关的日期范围。

问题在于,可能有2-3个与项目相关的重叠销售期。但是,销售将永远不会具有相同的结束日期,并且具有最后日期(或最高数字)的销售将在该期间具有该项目的真实成本,即使在前一时期存在不同的成本重叠的。

所以在给定此结构的情况下,我该怎样做才能在一天之内返回该项目的费用?

Item sales by date
-----------
itemID  |  Sales  | Date
---------------------------
1          $4.00    3/29
1          $5.00    4/1
1          $6,00    4/3

Sale Periods and Item Costs
===========================
item ID | StartDate | EndDate  |  Cost In Period | PeriodID
-----------------------------------------------------------
1         3/27        4/2         $2.00            1
1         4/1         4/16        $1.90            2

您可以看到销售额4/1似乎有两个可能相关的成本,而且我想要使用期末的成本。

所以结果将是

Item sales by date WITH COST
-----------
itemID  |  Sales  | Date | COST
--------------------------------
1          $4.00    3/29   $2.00
1          $5.00    4/1    $1.80
1          $6,00    4/3    $1.80

2 个答案:

答案 0 :(得分:1)

UNTESTED: 这可能很接近

SELECT ISBD.itemID, ISBD.Sales, ISBD.Date, SPIC.Cost
FROM ITemSalesByDate ISBD
LEFT JOIN  SalePeriodsandItemCosts SPIC
  ON SPIC.ItemID = ISBC.ItemID 
  AND SPIC.EndDate = 
   (SELECT max(SPIC2.ENDDATE) 
    FROM SalePeriodsandItemCosts SPIC2 
    WHERE SPIC2.ItemID = ISBD.ItemID)

我担心的一个问题是,子查询的性能可能更快,只需在salePeriodsandItemcosts上通过其他值进行第二次加入最大项目ID和组。

答案 1 :(得分:1)

假设这是SQLServer,请尝试:

with cte as
(select s.itemID, s.Sales, s.[Date], c.[Cost in Period],
        row_number() over (partition by s.itemID, s.[Date] 
                           order by c.EndDate desc) rn
 from sales s
 join costs c 
   on s.itemID = c.[item ID] and s.Date between c.StartDate and c.EndDate)
select itemID, Sales, [Date], [Cost in Period]
from cte
where rn=1

SQLFiddle here