【问题标题】:'Group by' is not grouping by in the order that I need it to\'Group by\' 没有按照我需要的顺序进行分组
【发布时间】:2022-11-22 22:03:50
【问题描述】:

我想对啤酒进行“分组”,以便将它们组合在一起,并在单独的列中列出尊重的总评分和品尝者(评论啤酒的人)。

这是我的代码:

create or replace view tasters_avg_ratings1
as
select a.taster as taster, a.beer as beer, round(avg(a.rating),1) as rating 
from allratings a
group by beer, taster
;

然而我的输出看起来像这样:

beers=# select * from tasters_avg_ratings1;
 taster |          beer          | rating 
--------+------------------------+--------
 Peter  | XXXX                   |    5.0
 Sarah  | James Squire Pilsener  |    3.0
 Raghu  | Sierra Nevada Pale Ale |    3.0
 Hector | Fosters                |    3.0
 John   | Chimay Red             |    3.0
 John   | Sierra Nevada Pale Ale |    5.0
 Geoff  | James Squire Pilsener  |    4.0
 Ramez  | Sierra Nevada Pale Ale |    4.0
 John   | 80/-                   |    4.0
 John   | Rasputin               |    4.0
 Adam   | Old                    |    4.0
 John   | Crown Lager            |    2.0
 Jeff   | Sierra Nevada Pale Ale |    4.0
 Sarah  | Burragorang Bock       |    4.0
 Sarah  | Scharer's Lager        |    3.0
 Sarah  | New                    |    2.0
 Geoff  | Redback                |    4.0
 Adam   | Victoria Bitter        |    1.0
 Sarah  | Victoria Bitter        |    1.0
 Raghu  | Rasputin               |    3.0
 Ramez  | Bigfoot Barley Wine    |    3.0
 Hector | Sierra Nevada Pale Ale |    4.0
 Sarah  | Old                    |    3.0
 Jeff   | Burragorang Bock       |    3.0
 John   | Empire                 |    3.0
 Sarah  | James Squire Amber Ale |    3.0
 Rose   | Redback                |    5.0
 Geoff  | Empire                 |    3.0
 Adam   | New                    |    1.0
 Jeff   | Rasputin               |    1.0
 Raghu  | Old Tire               |    5.0
 John   | Victoria Bitter        |    1.0
(32 rows)

如您所见,啤酒并未分组在一起。例如,理想情况下,“Victoria Bitter”啤酒应该作为一组展示,而不是分开展示。

期望的结果是使用“order by”实现的。例如:

create or replace view tasters_avg_ratings1
as
select a.taster as taster, a.beer as beer, round(avg(a.rating),1) as rating 
from allratings a
group by beer, taster
order by a.beer
;

输出:

beers=# select * from tasters_avg_ratings1;
 taster |          beer          | rating 
--------+------------------------+--------
 John   | 80/-                   |    4.0
 Ramez  | Bigfoot Barley Wine    |    3.0
 Jeff   | Burragorang Bock       |    3.0
 Sarah  | Burragorang Bock       |    4.0
 John   | Chimay Red             |    3.0
 John   | Crown Lager            |    2.0
 Geoff  | Empire                 |    3.0
 John   | Empire                 |    3.0
 Hector | Fosters                |    3.0
 Sarah  | James Squire Amber Ale |    3.0
 Geoff  | James Squire Pilsener  |    4.0
 Sarah  | James Squire Pilsener  |    3.0
 Adam   | New                    |    1.0
 Sarah  | New                    |    2.0
 Adam   | Old                    |    4.0
 Sarah  | Old                    |    3.0
 Raghu  | Old Tire               |    5.0
 Jeff   | Rasputin               |    1.0
 John   | Rasputin               |    4.0
 Raghu  | Rasputin               |    3.0
 Geoff  | Redback                |    4.0
 Rose   | Redback                |    5.0
 Sarah  | Scharer's Lager        |    3.0
 Hector | Sierra Nevada Pale Ale |    4.0
 Jeff   | Sierra Nevada Pale Ale |    4.0
 John   | Sierra Nevada Pale Ale |    5.0
 Raghu  | Sierra Nevada Pale Ale |    3.0
 Ramez  | Sierra Nevada Pale Ale |    4.0
 Adam   | Victoria Bitter        |    1.0
 John   | Victoria Bitter        |    1.0
 Sarah  | Victoria Bitter        |    1.0
 Peter  | XXXX                   |    5.0
(32 rows)

因此,虽然我知道 order by 可以达到我的结果,但为什么“group by”不做同样的事情?这是令人沮丧的,因为我在 Internet 上看到过许多使用“分组依据”的示例,并且特别是在与我类似的非聚合列和聚合列的情况下。例如:https://learnsql.com/blog/error-with-group-by/,提示 #3。

任何帮助将不胜感激,谢谢!

【问题讨论】:

  • 通常,当应应用特定排序时,需要 ORDER BY 子句。使用 GROUP BY 设置 GROUPING(因此命名为 GROUP BY,而不是 ORDER BY),所以 ORDER BY 还是必须的。
  • 嘿 Jonas - 你能否详细说明“分组依据”集“分组”的含义?这是否意味着它不一定会将所有共享相同名称的啤酒放入表中的连续块中?我在网站上链接的例子怎么样。谢谢

标签: sql postgresql group-by psycopg2 plpgsql


【解决方案1】:

GROUP BY 仅用于计算聚合值(在本例中为平均评分)。它与结果显示时的顺序无关。正如您所提到的,您需要使用 ORDER BY 来获得所需的顺序。

【讨论】:

    猜你喜欢
    • 2018-06-06
    • 1970-01-01
    • 1970-01-01
    • 2010-11-08
    • 2013-01-27
    • 1970-01-01
    • 1970-01-01
    • 2020-08-19
    • 1970-01-01
    相关资源
    最近更新 更多