按名称分组,仅显示第一条记录

Posted

技术标签:

【中文标题】按名称分组,仅显示第一条记录【英文标题】:Group By name by showing only the first records 【发布时间】:2021-04-22 08:14:28 【问题描述】:

谁能告诉我如何将 group by 用于仅 3 列? 这是我的表(sample1)

|vendorid | storeid | yearid | earnamount  |Name |
|---------|---------|--------|-------------|-----|
|1        |   2     | 2007   | 100         |  A  |   
|1        |   2     | 2007   | 150         |  C  |  
|1        |   3     | 2007   | 100         |  E  |  
|2        |   2     | 2008   | 500         |  F  |  
|2        |   2     | 2007   | 200         |  H  |  
|2        |   2     | 2008   | 500         |  J  |  
|3        |   1     | 2007   | 100         |  L  |  
|4        |  4      | 2008   | 230         |  N  |  

我希望我的结果是这样的: 显示结果,名称列仅显示记录中的第一个

|vendorid | storeid | yearid | sum(earnamount) | Name |
|---------|---------|--------|-----------------|------|
|1        |  2      | 2007   |    250          | A    |
|1        |  3      | 2007   |    100          | E    |
|2        |  2      | 2008   |    1000         | F    |
|2        |  2      | 2007   |    200          | H    |
|3        |   1     | 2007   |    100          | L    |
|4        |   4     | 2008   |    230          | N    |

这是我的 sql 命令:

select vendorid, storeid, yearid, sum(earnamount), name
from sample1
group by vendorid,storeid, yearid

不确定下一步是什么。

【问题讨论】:

select vendorid, storeid, yearid, sum(earnamount), MAX(name)AS NAME from sample1 group by vendorid,storeid, yearid 您使用的是什么数据库?某些数据库的解决方案选项可能不同。 【参考方案1】:

没有“第一”记录,除非列定义了排序。为了做你想做的事,你需要name 上的聚合函数。例如:

select vendorid, storeid, yearid, sum(earnamount),
       min(name) as name
from sample1
group by vendorid, storeid, yearid;

如果您希望名称与最小或最大的earnamount 相关联(例如),您可以使用条件聚合:

select vendorid, storeid, yearid, sum(earnamount),
       first_name
from (select s1.*,
             first_value(name) over (partition by vendorid, storeid, yearid order by earnamount desc) as first_name
      from sample1 s1
     ) s1
group by vendorid, storeid, yearid, first_name;

【讨论】:

【参考方案2】:

如果选择块确实有 GROUP BY 子句,则在 SELECT 子句中指定的任何列规范必须仅作为聚合函数的参数或在 GROUP BY 子句中给出的列列表中出现,或同时出现在两者中。 所以在 GROUP BY 中删除名称或添加名称列

select vendorid, storeid, yearid, sum(earnamount)
from sample1
group by vendorid,storeid, yearid

或者

select vendorid, storeid, yearid, sum(earnamount), name
from sample1
group by vendorid,storeid, yearid,name

【讨论】:

当我分组时,我需要该名称只显示表中的第一个,而不考虑它的值。

以上是关于按名称分组,仅显示第一条记录的主要内容,如果未能解决你的问题,请参考以下文章

对相关记录进行分组,但仅从第一条记录中选择某些字段

mysql表里数据分类,分类后显示每组分类里面第一条记录

mysql 分组后 每组随机取一条记录 求sql语句

sql中筛选第一条记录分组排序

ORACLE 查询去重保留第一条排序

如何使用聚合函数在 MySQL 查询中获取分组记录的第一条和最后一条记录?