2016-12-05 40 views
0

我想在SQL中使用MIN函数,但我不断收到很多行,而不仅仅是MIN行。sql - 使用MIN功能

我使用本教程http://www.w3schools.com/SQl/trysql.asp?filename=trysql_func_min

运行此查询

SELECT 
    P.ProductID, 
    MIN(Price) AS SmallestOrderPrice 
FROM Products P 
GROUP BY ProductID; 

我想仅仅是一个拥有最小价格从所有的价格行,它的相应的产品。如果不止一种产品具有相同的价格,我希望它返回两种产品。

+0

你是什么意思*我不断收到很多行*?每个产品你应该得到一行。如果你有很多产品,你显然会得到很多行。 –

+0

你期待看到什么结果?你只想要价格最低的产品? – Siyual

+0

你应该得到每个产品的最低价格。 eahc PRODUCTID返回应该是uniq,并且您获得每个产品价格的最小值。如果您只需要MIN价格并知道它是什么产品,则需要使用其他查询。 – xQbert

回答

2

也许你想要所有产品的生产率和最低价格。

窗口函数的方式。

SELECT * 
FROM (SELECT P.ProductID, Price AS SmallestOrderPrice, row_number() over (order by price asc) RN 
     FROM Products P) 
WHERE RN = 1 

还是我的老标准...(通常工作在所有平台和有用的,如果你需要从2表中的数据,你似乎没有)

SELECT * 
FROM products P 
INNER JOIN (Select min(price) mp from products) P2 
on P.Price = P2.MP 

或使用该方法存在...

SELECT P.* 
    FROM products P 
    WHERE EXISTS (SELECT min(price) mp 
       FROM products P2 
       WHERE P2.Price = P.Price) 

我不知道,如果有会工作,但现在看来似乎应该

(跨所有DBMS和可能的最快的一般标准)
SELECT 
    P.ProductID, 
    MIN(Price) AS SmallestOrderPrice 
FROM Products P 
GROUP BY ProductID 
HAVING min(Price) = price 
+0

谢谢,你的一个方法做到了! – Mumfordwiz

0

最低价格的所有行。

SELECT MIN(Price) 
    FROM Products 

如果你希望所有的ID也

SELECT 
p.ProductID 
, mp.MinPrice AS SmallestOrderPrice 
FROM 
    Products P 
    CROSS APPLY (SELECT MIN(Price) MinPrice FROM Products) AS mp 
WHERE 
    p.Price = mp.MinPrice 
2

下面是您的查询,以TOP 1ORDER BY Price ASC增加。

ORDER BY将导致您的当前退货按ASCending顺序排列,并将最小价格放在顶部。然后TOP 1将限制它只是最小的价格。

SELECT TOP 1 
    P.ProductID, 
    MIN(Price) AS SmallestOrderPrice 
FROM Products P 
GROUP BY ProductID 
ORDER BY Price ASC; 

请注意,如果有多个产品具有相同的最低价格,则不会返回所有这些产品。在这种情况下,xQbert的查询可能是最好的。