【问题标题】:Simple SQL query with select and group by使用 select 和 group by 的简单 SQL 查询
【发布时间】:2012-10-31 07:01:30
【问题描述】:

我有一些问题要理解。

我有下一张桌子:

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 值。

您可以在下一个link查看它

我做错了什么?

【问题讨论】:

  • 您的问题是 GROUP BY 不会告诉您哪一行的价格最小值,只会告诉您最小值是多少。

标签: sql sql-server tsql select group-by


【解决方案1】:
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

【讨论】:

  • 对此的 MS-SQL 查询是什么?你能解释一下我写的有什么问题吗
  • 你能解释一下我写的有什么问题吗,获取 ID 列有什么问题?
  • @OfirA。您当前的查询将无法在 MSSQL 或 TSQL)上工作,因为您尚未定义 ID,它未在 GROUP BY 子句中聚合。为了让它工作select id, prod, min(price) from A1 group by id,prodclick here但是这不会给你你想要的结果。
【解决方案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 列,那么您会得到一个用于正确的 prodMIN(price) 值的 ID 的准随机值。基本上,优化器会根据自己的想法选择它知道的任何方便的 ID。具体来说,它不会像完整答案那样进行子查询和连接。例如,它可能会进行顺序扫描,它返回的 ID 可能是它遇到的给定 prod 值的第一个或最后一个 ID,或者它可能是其他一些值——我什至不确定是否为 prod = 'A' 返回的 ID 必须是与 prod = 'A' 关联的 ID;您必须仔细阅读手册。基本上,您的查询是不确定的,因此许多返回值是允许的且“正确”(但不是您想要的)。

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

【讨论】:

  • 你能解释一下我写的有什么问题吗,是的,我需要 ID 列。
猜你喜欢
  • 2020-08-15
  • 2021-09-28
  • 2019-01-21
  • 2012-05-28
  • 1970-01-01
  • 2021-11-17
  • 2013-07-05
  • 2014-12-17
  • 1970-01-01
相关资源
最近更新 更多