2

我有一些问题要理解。

我有下一张桌子:

ID  PROD    PRICE
1   A        10
2   B        20
3   C        30
4   A        1
5   B        12
6   C        2
7   A        7
8   B        8
9   C        9
10  A        5
11  B        2

我想获得所有产品的所有最低价格,这意味着我想获得 3 条记录,即每个产品的最低价格。从上面的示例中,这就是我想要得到的:

ID  PROD    MIN(PRICE)
4   A       1
11  B       2
6   C       2

这是我写的查询:

select id, prod, min(price)
from A1
group by(prod);

但这是我得到的记录:

ID  PROD    MIN(PRICE)
1   A        1
2   B        2
3   C        2

如您所见,ID 值是错误的,它只是给我某种行计数器,而不是实际的 ID 值。

您可以在下一个链接中查看

我做错了什么?

4

2 回答 2

8
SELECT  a.*
FROM    A1 a
        INNER JOIN
        (
            SELECT Prod, MIN(Price) minPrice
            FROM A1
            GROUP BY Prod
        ) b ON a.Prod = b.Prod AND
                a.Price = b.minPrice

为了MSSQL

SELECT ID, Prod, Price
FROM
(
  SELECT ID, Prod, Price,
        ROW_NUMBER() OVER(Partition BY Prod ORDER BY Price ASC) s
  FROM A1
) a
WHERE s = 1
于 2012-11-11T18:01:25.337 回答
2

您必须使用 MySQL 或 PostgreSQL。

在标准 SQL 中,必须在 GROUP BY 子句中引用选择列表中的所有非聚合列。

我不清楚您是否需要 ID 列。如果没有,那么使用:

SELECT prod, MIN(price) AS min_price
  FROM A1
 GROUP BY prod;

如果您需要匹配的 ID 号,那么这将成为一个子查询:

SELECT id, prod, price
  FROM A1
  JOIN (SELECT prod, MIN(price) AS min_price
          FROM A1
         GROUP BY prod
       ) AS A2 ON A1.prod = A2.prod AND A1.price = A2.min_price;

您能否解释一下我写的内容有什么问题,是的,我需要 ID 列。

select id, prod, min(price)
from A1
group by(prod);

在标准 SQL 中,您会收到一条错误消息(或者,如果不是标准的,在大多数 SQL DBMS 中)。

在允许您从 GROUP BY 子句中省略 ID 列的情况下,您将获得 ID 的准随机值,以获得正确的prodMIN(price)值。基本上,优化器会根据自己的想法选择它知道的任何方便的 ID。具体来说,它不会像完整答案那样执行子查询和连接。例如,它可能会进行顺序扫描,它返回的 ID 可能是给定prod值遇到的第一个或最后一个 ID,或者它可能是其他值——我什至不确定返回的 ID 是否为prod = 'A'必须是与关联的 ID prod = 'A';您必须仔细阅读手册。基本上,您的查询是不确定的,因此许多返回值是允许的并且是“正确的”(但不是您想要的)。

请注意,如果您按 ID 而不是 分组prod,则结果prod将是确定的。这是因为 ID 列是表的候选键(唯一标识符)。(我相信 PostgreSQL 区分了这两种情况——但我不确定;MySQL 没有。)

于 2012-11-11T18:04:18.460 回答