【问题标题】:How to return MAX and MIN of a value from a table?如何从表中返回一个值的 MAX 和 MIN?
【发布时间】:2013-08-13 10:14:22
【问题描述】:

我想获取最新的成本计算日期和产品的最低成本。

当我使用下面的查询时,它会为我提供每列的最大日期和最小成本。请看下面的截图。

SELECT MAX(CostingDate) AS LatestDate,
MIN(Cost) AS MinPrice,
OutletCode,
ProductID  
FROM AccountsCosting
WHERE OutletCode = 'C&T01'
GROUP BY OutletCode, ProductID

结果:

例如 - 产品 ID:200006

SELECT * FROM AccountsCosting
WHERE ProductID = 200006 AND OutletCode = 'C&T01'
ORDER BY CostingDate DESC

我想要的是成本最低的最后一个成本核算日期(我用红色突出显示的那个)。即使购买日期相同2013-03-20,也应该返回最低成本。

如何编辑我的查询以获得结果?任何帮助将不胜感激!

【问题讨论】:

  • 你把这个问题弄得很混乱,所以你只想突出突出显示的行?
  • 是的!我想获得最新成本核算日期的成本。我解释得越多,它就越糊涂。
  • 好吧,听上去你会想要使用 SELECT TOP 1 子句。我现在将为您发布一个答案,看看它是否是您正在寻找的结果。

标签: sql max min


【解决方案1】:

首先您需要获取最新日期,然后您可以找到他们的最低费用。例如

 select 
    a.OutletCode, 
    a.ProductID,
     LatestDate,
    MIN(Cost) AS MinPrice

from

    (
    SELECT MAX(CostingDate) AS LatestDate,
    OutletCode,
    ProductID  
    FROM AccountsCosting
    WHERE OutletCode = 'C&T01'
    GROUP BY OutletCode, ProductID
    ) a
    left join 
    FROM AccountsCosting b
    on
    a.OutletCode=b.OutletCode
    and a.ProductID=b.ProductID  
    and a.LatestDate=b.CostingDate

    group by a.OutletCode, a.ProductID, LatestDate

【讨论】:

  • 这正是我想要的。如果不显示我的查询,真的很难解释我想要做什么。非常感谢您的帮助。
【解决方案2】:

如果我理解正确的话,你想要最近日期的最低费用吗?!

试试这个:

SELECT CostingDate AS LatestDate,
Cost AS MinPrice,
OutletCode,
ProductID  
FROM AccountsCosting
WHERE OutletCode = 'C&T01'
and CostingDate in (SELECT MAX(CostingDate) as CostingDate FROM AccountsCosting WHERE OutletCode = 'C&T01')
and Cost in (SELECT MIN(Cost) as Cost FROM AccountsCosting WHERE OutletCode = 'C&T01' and CostingDate in (SELECT MAX(CostingDate) as CostingDate FROM AccountsCosting WHERE OutletCode = 'C&T01'))
GROUP BY OutletCode, ProductID;

【讨论】:

  • 由于在WHERE 语句中使用了IN,它只返回了我表中所有记录中的最新成本计算日期和成本的一行。无论如何,我真的很感谢你的帮助!为您的回答 +1。
【解决方案3】:

如果您使用SQL Server 2005,之后您可以使用CTERANK() OVER()

;WITH AccountCostingForOutletCode AS  (
    SELECT OutletCode, ProductID, CostingDate, Cost, 
       RANK() OVER( PARTITION BY OutletCode, ProductID ORDER BY Cost, CostingDate DESC) AS Rnk
    FROM AccountsCosting
    WHERE OutletCode = 'C&T01'
)
SELECT TOP 1 OutletCode, ProductID, CostingDate, Cost, Rnk
FROM AccountCostingForOutletCode
ORDER BY Rnk

【讨论】:

    【解决方案4】:

    我认为您需要对 MAX 和 MIN 进行 2 次查询,然后将它们连接在一起以获得您的单行。我会使用临时表或 CTE,例如

    WITH CTE_Max AS
    (SELECT MAX(costingDate) as latestDate,
     Oultletcode,
    ProductID
    FROM AccountsCosting
    GROUP BY OutletCode, ProductID),
    
    CTE_Min AS
    (SELECT MIN(cost) as MinPrice,
    Oultletcode,
    ProductID
    FROM AccountsCosting
    GROUP BY OutletCode, ProductID)
    
    SELECT * FROM CTE_Max 
    JOIN CTE_Min
    ON CTE_Max.outletCode=CTE_Min.outletCode
    AND CTE_Max.productID=CTE_Min.productID
    

    【讨论】:

      【解决方案5】:

      如果你只想显示输出,你可以使用一些东西

      SELECT ProductName,Max(price) as MxP, '-' as minP from products 
      UNION
      SELECT ProductName,'-' as MxP , Min(price) as minP from products
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-06-10
        • 2019-04-10
        • 2018-11-05
        • 2017-08-24
        • 2019-05-30
        • 2021-11-15
        • 1970-01-01
        相关资源
        最近更新 更多