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

Group By name by showing only the first records

谁能告诉我如何将分组依据仅用于 3 列? 这是我的 table(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 块确实有 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

没有“第一个”记录,除非列定义了顺序。为了做你想做的事,你需要 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;