按名称分组,仅显示第一条记录
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
【讨论】:
当我分组时,我需要该名称只显示表中的第一个,而不考虑它的值。以上是关于按名称分组,仅显示第一条记录的主要内容,如果未能解决你的问题,请参考以下文章