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

时间:2021-04-22 08:14:28

标签: sql snowflake-cloud-data-platform snowflake-schema

谁能告诉我如何将 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  |  

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

|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

不确定下一步是什么。

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

没有“第一”记录,除非一列定义了排序。要执行您想要的操作,您需要在 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;
相关问题