首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >为每组数据聚合一组结果

为每组数据聚合一组结果
EN

Stack Overflow用户
提问于 2018-09-17 04:40:30
回答 3查看 71关注 0票数 1

我有一份国家名单。每个简短的缩写(简短)对应于一个国家,但是除了以下面列表结尾的国名外,人们还喜欢输入其他变量。

输出

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
short        nation     Students
   A           A           604
   A        Austria       6707
   A       Österreich     3400
   AFG        Afg           18
   AFG    Afghanistan     1991
   AGL       Angola         16
   AGN      Guinea           2
   AL         Al             5
   AL       Albanien        61
   ARM        Arm            6
   ARM      Armenien        87

因此,正如你所看到的,计算每个国家的学生总数可以得到2到3个结果。因此,很显然,我想到了一个问题,如果可以计算出每一个短短线的和,如下所示

预期产出

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
short        nation     Students
   A           A           604
   A        Austria       6707
   A       Österreich     3400
   A                     10711 
   AFG        Afg           18
   AFG    Afghanistan     1991
   AFG                    2009
   AGL       Angola         16
   AGN      Guinea           2
   AL         Al             5
   AL       Albanien        61
   AL                       66
   ARM        Arm            6
   ARM      Armenien        87
   ARM                      93

我的代码如下

第1部分

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
with natctf as (
SELECT  short, 
        nation, 
        cast(Studentcount as varchar(6)) as Studentcount
        FROM (
                SELECT  ctf.shorttext as short, ctf.longtext as nation,
                                count(distinct s.studentid) as Studentcount
                from students s
                    join pupil p on p.id = s.pupilid
                    join pupilnation pn on pn.pupilid = p.id
                    join country ctf on ctf.id = pn.coutnryid

                Group by ctf.shorttext,ctf.longtext
                Order by ctf.shorttext
) t )

第2部分

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT short, initcap(nation), Studentcount
FROM natctf

UNION ALL
SELECT null as short, 
       cast(count(nation) as varchar(3)) ||' Nations', 
       cast(SUM(cast(Studentcount as bigint)) as varchar(10)) ||' Students'
FROM natctf
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-09-17 07:23:26

免责声明:这是PostgreSQL版本9.0-9.4的解决方案。对于Postgres 9.5或更高版本,我将使用@LaurenzAlbe的GROUPING SETS解决方案

demo: db<>fiddle

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
WITH count_nations AS (                                               -- A
    SELECT 
        *, 
        sum(students) OVER (PARTITION BY short) as total              -- B
    FROM nations
)
SELECT short, name, students FROM count_nations                       -- C            
UNION                                                                 -- E
SELECT short, NULL, total FROM count_nations                          -- D

ORDER BY 
    short, 
    name NULLS LAST,                                                  -- F
    students

答:WITH子句使查询更具可读性,因为您不需要编写相同的子查询两次。

B:窗口函数(https://www.postgresql.org/docs/current/static/tutorial-window.html) SUM汇总给定帧中的所有值(这里是short列)。因此,你得到的国家总数作为单独的一栏。

子查询的结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
short     name          students   total
A         A             604        10711
A         Austria       6707       10711
A         Österreich    3400       10711
AFG       Afg           18         2009
AFG       Afghanistan   1991       2009
AGL       Angola        16         16
AGN       Guinea        2          2
AL        Al            5          66
AL        Albanien      61         66
ARM       Arm           6          93
ARM       Armenien      87         93

C:选择原始列..。

选择没有名字的新列..。

E:UNION两种结果。UNION使结果变得明显,所以每个国家只能得到一行。(UNION ALL不会做不同的事情)

F:排序结果。对于国家行,NULL值应该是最后一个。

结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
short   name          students
A       A             604
A       Austria       6707
A       Österreich    3400
A                     10711
AFG     Afg           18
AFG     Afghanistan   1991
AFG                   2009
AGL     Angola        16
AGL                   16
AGN     Guinea        2
AGN                   2
AL      Al            5
AL      Albanien      61
AL                    66
ARM     Arm           6
ARM     Armenien      87
ARM                   93

在您的示例中,您只为多个行的国家添加额外的行。例如,对于AGN,您不添加行。如果这是您的意图,那么上面链接的db<>fiddle向您展示了解决方案:

  1. WITH子句中添加每个窗口帧的行计数器
  2. 使用UNION筛选所有国家的row_count > 1子查询
票数 2
EN

Stack Overflow用户

发布于 2018-09-17 05:33:21

最好的解决方案是使用分组集,这是一种SQL标准特性,对您的用例来说正是正确的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT ctf.shorttext as short,
       ctf.longtext as nation,
       count(...)
FROM country AS ctf JOIN ...
GROUP BY GROUPING SETS ((ctf.shorttext, ctf.longtext), (ctf.shorttext))
ORDER BY ctf.shorttext, ctf.longtext
票数 2
EN

Stack Overflow用户

发布于 2018-09-17 05:03:35

UNION ALL是一个查询,其中GROUP BY是短名称和长名称,另一个是只按短名称分组的查询。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT x.short,
       x.nation,
       x.studentcount
       FROM (SELECT ctf.shorttext short,
                    ctf.longtext nation,
                    count(DISTINCT s.studentid) studentcount
                    FROM students s
                         INNER JOIN pupil p
                                    ON p.id = s.pupilid
                         INNER JOIN pupilnation pn
                                    ON pn.pupilid = p.id
                         INNER JOIN country ctf
                                    ON ctf.id = pn.coutnryid
                    GROUP BY ctf.shorttext,
                             ctf.longtext
             UNION ALL
             SELECT ctf.shorttext short,
                    NULL nation,
                    count(DISTINCT s.studentid) studentcount
                    FROM students s
                         INNER JOIN pupil p
                                    ON p.id = s.pupilid
                         INNER JOIN pupilnation pn
                                    ON pn.pupilid = p.id
                         INNER JOIN country ctf
                                    ON ctf.id = pn.coutnryid
                    GROUP BY ctf.shorttext) x
      ORDER BY x.short,
               x.nation NULLS LAST;

注意,按短名称分组的查询的计数不能是计数的总和,其他查询将返回。那是因为不同的计数。如果对一个学生来说,有几个不同的长名字,有一个短名,他们会被计算在长名的每一组中,但在组中只有一次作为短名。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52368000

复制
相关文章
Elasticsearch 聚合数据结果不精确,怎么破?
请教一个问题,ES 在聚合的时候发生了一个奇怪的现象聚合的语句里面size设置为10和大于10导致聚合的数量不一致,这个size不就是返回的条数吗?会影响统计结果吗?dsl语句摘要(手机敲不方便,双引号就不写了):
铭毅天下
2020/07/24
3.5K0
Elasticsearch 聚合数据结果不精确,怎么破?
ES 基于查询结果的聚合
在了解本文内容前,必须先了解ES DSL查询和ES 聚合查询,ES基于查询结果的聚合分为两种,第一种类似与关系型数据库中的Having语法,第二种类似于关系型数据库中先where在group by的语法,本文主要分析先查询后聚合场景
郑小超.
2022/09/21
1.4K0
[Elasticsearch] ES聚合场景下部分结果数据未返回问题分析
在对ES某个筛选字段聚合查询,类似groupBy操作后,发现该字段新增的数据,聚合结果没有展示出来,但是用户在全文检索新增的筛选数据后,又可以查询出来, 针对该问题进行了相关排查。
awwewwbbb
2021/12/30
1.7K0
[Elasticsearch]  ES聚合场景下部分结果数据未返回问题分析
Elasticsearch聚合学习之四:结果排序
本文是《Elasticsearch聚合学习》系列的第四篇,在前面的实战中,聚合的结果以桶(bucket)为单位,放在JSON数组中返回,这些数据是没有排序的,今天来学习如何给这些数据进行排序;
程序员欣宸
2019/05/27
7.8K0
[793]mysql表分组后取每组前几条数据
需求:按照p_code字段对product表进行分组并取每组的前两条数据 SQL语句:
周小董
2020/05/07
6.7K0
[793]mysql表分组后取每组前几条数据
Jmeter 测试结果分析之聚合报告简介
对于每个请求,它统计响应信息并提供请求数,平均值,最大,最小值,错误率,大约吞吐量(以请求数/秒为单位)和以kb/秒为单位的吞吐量.
授客
2019/09/11
2.1K0
Jmeter 测试结果分析之聚合报告简介
oracle行转列函数 聚合_oracle查询结果行转列
2.使用 listagg() WITHIN GROUP () 将多行合并成一行(比较常用)
全栈程序员站长
2022/10/04
1.4K0
oracle行转列函数 聚合_oracle查询结果行转列
团队管理 - 以结果为导向
结果导向是ISO质量管理体系、绩效管理理论中的基本概念和核心思想之一,即强调经营、管理和工作的结果(经济与社会效益和客户满意度),经营管理和日常工作中表现出来的能力、态度均要符合结果的要求,否则没有价值和意义。(来源百度百科)
十毛
2022/08/23
6210
Elasticsearch聚合学习之五:排序结果不准的问题分析
版权声明:欢迎转载,请注明出处,谢谢。 https://blog.csdn.net/boling_cavalry/article/details/90319399
程序员欣宸
2019/05/26
2.8K0
PHP中把数据库查询结果输出为json格式
可以看到,直接进行json_encode();编码,是将三个数组分别转为了json格式,而且两端会出现中括号!!还有另外一种写法
Yiiven
2022/12/15
1.9K0
ThinkPHP5.1 子查询-使用 Group 获取每组最新数据
( 该查询方式利用了PHP的生成器特性,可以大幅减少大量数据查询的内存占用问题 )
泥豆芽儿 MT
2022/01/05
2.3K0
ThinkPHP5.1 子查询-使用 Group 获取每组最新数据
PHP如何将数据库查询结果输出为json格式
近期做接口的时候需要做到一个操作,将数据库查询结果输出为json格式方便程序调用。 于是在网上看到了两种解法,就此分享出来,供大家学习以及自己日后进行参考。 可将其封装成专门将数据转换成json格式的接口
吃猫的鱼Code
2023/02/02
3.3K0
聚合数据是什么东西?聚合数据有哪些服务?
现在社会是属于大数据的时代,相信大家都是听说过大数据这个词的,通过大数据我们可以知道很多很多的信息,因此数据对于互联网时代是非常重要的东西,现在的各行各业都需要数据的支持,而现在相关的厂商将人们需要的众多数据聚合在一起,为大家提供更加方便的了解数据方式,被称为聚合数据,那么聚合数据是什么东西?聚合数据有哪些服务?下面小编就为大家带来详细介绍一下相关的内容。
用户8739990
2021/06/25
2.9K0
前端测试题: 下面Symbol运算结果,结果为true的是?
symbol 是一种基本数据类型 (primitive data type)。Symbol()函数会返回symbol类型的值.
舒克
2020/03/12
7690
微服务-数据聚合CQRS
微服务经常是按业务维度划分多个服务(当然还有其他各种考虑维度), 划分为多个维度后, 好处自然很多, 其中也会有一些问题, 比如我们讲的数据依赖问题
用户2825413
2020/09/18
1.3K0
微服务-数据聚合CQRS
用Turbine聚合监控数据
Hystrix Dashboard实现了数据监控,但是只能看到单个应用内的服务信息,Netflix提供了Turbine,可以把多个"hystrix.stream"的内容聚合为一个数据源供Dashboard展示。
星哥玩云
2022/09/15
3620
Pandas进阶之数据聚合
---- 概述 在之前的前面几篇博客中,详细介绍了Pandas的一些基础和高级特性。今天博主继续介绍一个Pandas的进阶之数据聚合。 数据聚合 pandas可以支持像sql语句那样,对数据进行聚合操作。比如:groupby,combine等等。 GroupBy技术 我们可以将一个Pandas的DataFrame结构进行拆分-应用-合并操作。比如: In [6]: df = DataFrame({'key1':'aabba','key2':["one","two","one","two ...: "
吕海峰
2018/04/03
9840
MySQL中用快速为select结果加序号
set @a=0;select @a:=@a+1,user,host from mysql.user;
莫晓东do
2018/07/17
5.4K1
Java中fastjson的toJSONString结果为空{}
1.背景 1.1 一个实体类 public class User { @JSONField(name = "ID") private String id; private String name; private String age; @JSONField(name = "LIKE_FOOD") private String likeFood; private Job job; public User(String id, String n
玖柒的小窝
2021/09/14
4.8K0
互联网数据聚合
我们经常需要从互联网上获取数据,在很多情况下,你需要的是特定信息,或者说是符合某些条件的信息,比如:
四火
2022/07/15
4500
互联网数据聚合

相似问题

每组的结果

32

每组的极限结果

13

elasticsearch聚合结果为0

13

Pandas中每组聚合的重采样

25

在MySQL中将一组行聚合为单个结果

11
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文