【问题标题】:Join two tables but only get most recent associated record加入两个表,但只获取最近的关联记录
【发布时间】:2014-07-25 00:51:30
【问题描述】:

我很难构建一个 sql 查询来获取与另一个(关联)表相关的所有相关数据,并循环到被认为是最新的数据集(或最近的)。

下图描述了我的两个表(Inventory 和 Sales),Inventory 表包含所有项目,Sales 表包含所有交易记录。 Inventory.Id 与 Sales.Inventory_Id 相关。 Wanted result 是我正在努力的输出。

我的目标是将所有销售记录与库存相关联,但只获取每件商品的最新交易。

使用普通连接(左、右或内)不会产生我正在寻找的结果 我不知道如何添加另一个类别,您可以在其中过滤最多要加入的最新数据。这是可行的还是我应该更改我的表架构?

谢谢。

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

    您可以使用APPLY

    Select Item,Sales.Price
    From Inventory I
         Cross Apply(Select top 1 Price
                     From Sales S
                     Where I.id = S.Inventory_Id
                     Order By Date Desc) as Sales
    

    【讨论】:

      【解决方案2】:
      WITH Sales_Latest AS (
        SELECT *,
          MAX(Date) OVER(PARTITION BY Inventory_Id) Latest_Date
        FROM Sales
      )
      SELECT i.Item, s.Price
      FROM Inventory i
      INNER JOIN Sales_Latest s ON (i.Id = s.Inventory_Id)
      WHERE s.Date = s.Latest_Date
      

      仔细考虑如果同一日期的销售中有两个价格,您期望的结果是什么。

      【讨论】:

      • 在特定日期,一件商品应该只有一个价格。
      • @ChiSen 理论上,“应该只有一个价格。”实际上,您要么有一个 UNIQUE 约束,要么有多个价格。
      【解决方案3】:

      我只会使用相关子查询:

      select Item, Price
        from Inventory i 
          inner join Sales s 
            on i.id = s.Inventory_Id
              and s.Date = (select max(Date) from Sales where Inventory_Id = i.id)
      

      【讨论】:

      • 这会产生一行,显示日期最近的项目。
      • @ChiSen 哦,抱歉,请尝试使用连接条件上的子查询(如编辑中所示)。
      【解决方案4】:
      select * from
      (
        select i.name, 
               row_number() over (partition by i.id order by s.date desc) as rownum,
               s.price,
               s.date
        from inventory i
        left join sales s on i.id = s.inventory_id
      ) tmp
      where rownum = 1
      

      SQLFiddle demo

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-04-23
        • 2017-04-30
        • 1970-01-01
        • 1970-01-01
        • 2016-05-30
        • 2011-03-08
        • 2012-03-23
        • 2015-10-09
        相关资源
        最近更新 更多