【问题标题】:Select data based on latest transaction date for each item根据每个项目的最新交易日期选择数据
【发布时间】:2019-08-20 06:52:39
【问题描述】:

我有一个查询,我希望它列出每个库存商品的所有最新交易价格。我尝试使用MAX() 列出每件商品的所有最新交易,但不包含价格,它有效,但是当我包含价格时,该方法将不起作用。

这是我的查询

SELECT MAX(DocDate) AS DocDate, StockCode, Price
FROM StockPurchasePriceHistory spph
INNER JOIN Stocks s
ON spph.Stock = s.Id
GROUP BY StockCode, Price
ORDER BY StockCode ASC

输出

【问题讨论】:

    标签: sql sql-server database


    【解决方案1】:

    使用行号

    select * from (SELECT row_number()over(partition by StockCode order by DocDate desc) rn
     , StockCode, Price
    FROM StockPurchasePriceHistory spph
    INNER JOIN Stocks s
    ON spph.Stock = s.Id
    ) a where a.rn=1
    

    【讨论】:

      【解决方案2】:

      试试这个:

      SELECT MAX(DocDate) AS DocDate, StockCode, sum(Price) as Price
      FROM StockPurchasePriceHistory spph
      INNER JOIN Stocks s
      ON spph.Stock = s.Id
      GROUP BY StockCode
      ORDER BY StockCode ASC
      

      【讨论】:

      • 我不想总结价格。我只想知道那个特定日期的价格。
      • 错误是什么?价格列在哪个表中?
      • 我要获取的是每件商品的最新交易价格。如果您在图片上看到,例如ACS-000005 最新交易为2017-10-16,价格为55.00。它应该只显示该行,而不是仅仅因为同一商品的价格不同而将其相乘。
      【解决方案3】:

      这是使用APPLY的好地方:

      SELECT spph.DocDate, s.StockCode, spph.Price
      FROM Stocks s CROSS APPLY
           (SELECT TOP (1) spph.*
            FROM StockPurchasePriceHistory spph
            WHERE spph.Stock = s.Id
            ORDER BY spph.DocDate DESC
           ) spph;
      

      使用StockPurchasePriceHistory(Stock, DocDate desc) 上的索引,我希望这比使用窗口函数的替代方法快一点,并且大约与相关子查询一样快。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-12-07
        • 1970-01-01
        • 2020-10-16
        • 2017-11-22
        • 2015-05-19
        • 2019-04-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多