为什么将列添加到分组依据会增加返回的行



为什么在查询中添加列和分组依据会增加返回的行数? 例如,下面是我的基本查询,但是如果我添加列,则会返回更多行。 添加的列越多,返回的行就越多。 似乎 where 子句条件应该是控制返回的行的唯一内容。

示例查询:

select pobj_name, max(prev) prev 
from pfmc_part 
where pmodel in ('PN-DWG', 'NO-DWG') and pstatus = 'RELEASED' 
group by pobj_name 
order by pobj_name

当你添加一个WHERE子句时,它会过滤将在GROUP BY旁边传递的行集,因此WHERE在组之前应用。 在应用GROUP BY之前,将要分组的行以及将对其执行SUM(),MAX(),MIN(),COUNT()等聚合的行已限制为与WHERE条件匹配的行。

至于为什么在将列添加到SELECTGROUP BY中时会获得更多行 - 嗯,这就是聚合GROUP BY的工作方式。 如果在SELECT中添加其他列,则还必须对它们进行分组(在大多数 RDBMS 中),并且只要行之间的值不同,它们就会导致更多的分组行。

请考虑下表:

Name   Score
John   2
Bill   3
John   1

Name上的单个GROUP BY会将John行折叠为一行:

SELECT Name, SUM(Score) AS total
FROM scores
GROUP BY name
Name   total
John   3
Bill   3

现在考虑此表,其中有另一列用于运动。 在这里,John有 2 种不同的运动代表,而比尔只有 1 项。 要将这两个Name, Sport都包含在SELECT列表中,它们也必须都在GROUP BY中。 跨行的相似值折叠成组,但现在John组相似的值要分组:

Name  Sport    Score
John  Baseball  3
John  Bowling   9
Bill  Baseball  10
Bill  Baseball  6
John  Bowling   12
SELECT Name, Sport, SUM(Score) AS total
FROM scores
GROUP BY Name, Sport
Name  Sport    total
John  Baseball 3
John  Bowling  21
Bill  Baseball 16

因此,如果GROUP BY列在行间具有不同的值,则向添加其他列将导致更多输出行。

WHERE 子句应用于第二个表以仅查找 John 行,将在应用组之前消除所有Bill行。结果将是两行。

SELECT Name, Sport, SUM(Score) AS total
FROM scores
-- Filter with a WHERE clause this time
WHERE Name = 'John'
GROUP BY Name, Sport
-- Results in only John's rows
Name  Sport    Score
John  Baseball 3
John  Bowling  21
考虑学生

分数表:

+-----------+------------+-------+
| Last_Name | First_Name | Score |
+-----------+------------+-------+
| Smith     | Bob        |    90 |
| Smith     | Bob        |    85 |
| Smith     | Alice      |   100 |
| Smith     | Alice      |    90 |
| Johnson   | Evelyn     |    80 |
| Johnson   | Evelyn     |    85 |
+-----------+------------+-------+

此查询:

SELECT Last_Name, MAX(Score) Score
FROM StudentScores
GROUP BY Last_Name

结果:

+-----------+-------+
| Last_Name | Score |
+-----------+-------+
| Smith     |   100 |
| Johnson   |    85 |
+-----------+-------+

但是,此查询:

SELECT Last_Name, MAX(Score) Score
FROM StudentScores
GROUP BY Last_Name, First_Name

结果:

+-----------+-------+
| Last_Name | Score |
+-----------+-------+
| Smith     |    90 |
| Smith     |   100 |
| Johnson   |    85 |
+-----------+-------+

那么有什么不同呢? 好吧,'Smith'是两个学生的Last_Name

SELECT Last_Name, First_Name, MAX(Score) Score
FROM StudentScores
GROUP BY Last_Name, First_Name

结果:

+-----------+------------+-------+
| Last_Name | First_Name | Score |
+-----------+------------+-------+
| Smith     | Bob        |    90 |
| Smith     | Alice      |   100 |
| Johnson   | Evelyn     |    85 |
+-----------+------------+-------+
添加新的

分组依据会增加您看到的结果数量,group by以另一种方式对数据进行分区。

如果您只使用聚合函数,则只会得到单行结果,对数据进行分组越精细,您看到的结果行就越多

where 子句控制由 group by 执行的分组的输入。having子句(如果存在)将控制返回给用户的结果。

最新更新