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

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

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

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

输出

代码语言:javascript
运行
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
运行
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
运行
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
运行
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
运行
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
运行
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
运行
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
运行
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
运行
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

复制
相关文章
React技巧之检查元素是否可见
原文链接:https://bobbyhadz.com/blog/react-check-if-element-in-viewport[1]
chuckQu
2022/08/19
1.1K0
CA2109:检查可见的事件处理程序
除非绝对必要,否则不要公开事件处理方法。 只要处理程序和事件签名匹配,就可以将调用公开方法的事件处理程序(委托类型)添加到任何事件中。 事件可能由任何代码引发,并且经常由高度可信的系统代码引发,以响应用户操作(例如单击某个按钮)。 向事件处理方法添加安全检查不会阻止代码注册调用方法的事件处理程序。
用户4268038
2022/02/20
5430
关于Java变量的可见性问题
摘要:关于java变量在工作内存和主存中的可见性问题 正文: package com.test;import java.util.concurrent.TimeUnit; public class test1 { private static boolean is = true; public static void main(String[] args) { new Thread(new Runnable() { @Override
itliusir
2018/05/21
1K0
kubernetes中不可见的OOM
最近看了一篇文章:Tracking Down “Invisible” OOM Kills in Kubernetes,其讲述的是由于内存不足导致Pod中的进程被killed,但Pod并没有重启,也没有任何日志或kubernetes事件,只有一个"Exit Code: 137"的信息,导致难以进一步定位问题。最后还是通过查看节点系统日志才发现如下信息:
charlieroro
2022/09/21
1.3K0
自定义类加载器加载jar包_类加载器的可见性
spring根本不会去管自己被放在哪里,它统统使用TCCL来加载类,而TCCL默认设置为了WebAppClassLoader,也就是说哪个WebApp应用调用了spring,spring就去取该应用自己的WebAppClassLoader来加载bean。这在真正理解线程上下文类加载器(多案例分析)中已有详细描述。 因此,为了使spring使用自定义的类加载器进行加载,需要开一个线程,将这个线程的类加载器设置为自定义类加载器。
全栈程序员站长
2022/10/04
8440
内存可见性
可见性:当一个线程修改了对象状态后,其他线程能够看到发生的状态变化。如果没有同步,这种情况就无法实现。 下面的代码说明了当多个线程在没有同步的情况下共享数据时出现的错误。在代码中,主线程和读线程都会访问共享变量ready和number。很显然代码看起来会输出42,但事实上肯可能输出0(重排序导致),甚至根本无法终止。这是因为代码中没有足够的同步机制,因此无法保证主线程写入ready和number对读线程是可见的。 public class NoVisibility{     private static b
SuperHeroes
2018/05/31
8360
可见光激光器---二
半导体可见光激光器的色系发展同LED同步。在1968年红色LED在美国问世。红、绿、蓝三基色一直是人们追求的单色光。在20世纪70年代人们实现了GaAlAs/GaAs 0.8um--0.85um的短波长异质结结构的半导体激光器。并在InP上实现了四元InGaAsP发射1.3um-1.55um的室温连续光谱,在光通信领域取得巨大应用。
用户2760455
2022/06/08
4770
可见光激光器---二
在Inspector面板中显示变量和类(Unity3D)
Unity有一个强大的特性,它可以帮助我们在没有任何编程的情况下修改Inspector面板中的值。本文介绍了我们需要知道的所有信息,以便在Unity Inspector面板中显示我们的变量和自定义类。
恬静的小魔龙
2022/08/07
3.3K0
在Inspector面板中显示变量和类(Unity3D)
Python的类和方法——成员可见性
使用装饰器@classmethod。第一参数必须是当前类对象,该参数名一般约定为「cls」,当然cls也可以换成其他名字,通过它来传递类的属性和方法(不能传实例的属性和方法)
stormwen
2019/08/05
9720
爬虫实现csdn文章一键(批量)更换阅读类型(全部可见、粉丝可见、vip可见)
“ 动手创造美好” - bigsai
bigsai
2019/09/24
2.7K0
爬虫实现csdn文章一键(批量)更换阅读类型(全部可见、粉丝可见、vip可见)
对象可见性
此引出 Java 的一个一般设计原则——对象默认可见。如果我有一个对象的引用,就可以复制一个副本,然后将其交给另一个线程,不受任何限制。Java 中的引用其实就是类型指针,指向内存中的一个位置,而且所有线程都共用同一个地址空间,所以默认可见符合自然规律。
宇宙之一粟
2020/11/24
4780
第四章:java 多线程volatile关键字 atomic类学习 java 原子性讲解,变量可见与不可见说明
volatile概念:volatile关键字的主要作用是使变量在多个线程间可见。
全栈程序员站长
2022/08/05
2360
【C语言笔记】ASCII码可见字符与不可见字符
ASCII(American Standard Code for Information Interchange,美国信息交换标准代码)是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧语言。下面看一段示例代码,用于输出ASCII码:
正念君
2019/06/26
4.7K0
【C语言笔记】ASCII码可见字符与不可见字符
github设置仓库可见性 私人仓库设置他人协作/可见
GitHub.com 的所有人访问,而私有仓库只有您和您与其共享的人员可访问。 内部仓库适用于 GitHub Enterprise Cloud 并且只有企业帐户的成员可访问。 更多信息请参阅“创建内部仓库”。
种花家的奋斗兔
2020/11/13
19.3K0
github设置仓库可见性  私人仓库设置他人协作/可见
Volatile 可见性承诺
Java Volatile 关键字是一种轻量级的数据一致性保障机制,之所以说是轻量级的是因为 volatile 不具备原子性,它对数据一致性的保障体现在对修改过的数据进行读取的场景下(也就是数据的可见性)。比起对读操作使用互斥锁, volatile 是一种很高效的方式。因为 volatile 不会涉及到线程的上下文切换,以及操作系统对线程执行的调度运算。同时 volidate 关键字的另一个功能是解决“指令重排序问题”。
不会飞的小鸟
2020/03/17
6940
PostgreSQL vacuum可见性
2)该tuple是当前事务产生的:此时这个记录在这个事务未删除或只是被锁住或进行了delete但是delete abort了,那返回HAPTUPLE_INSERT_IN_PROGRESS;若则记录又被删除了,那返回HEAPTUPLE_DELETE_IN_PROGRESS
yzsDBA
2020/10/28
4930
PostgreSQL vacuum可见性
并发编程系列之变量可见性问题探究
以例子的形式看看,定义一个变量,先用static修饰,在主线程修改之后,看看在新开的子线程里能被看到?
SmileNicky
2021/11/17
2940
并发编程系列之变量可见性问题探究
多线程的共享变量的内存不可见性
同步值之synchronized和volatile的区别 相同点:   synchronized 和 volatile都能用来同步共享变量 不同点:   1. volatile是轻量级的同步策略, 可以修饰基本类型的变量,如int, synchronized是重量级的同步策略,基于对象的同步锁   2. volatile不具备互斥性, 一个线程访问共享变量 , 其他线程也可以访问共享变量     synchronized是互斥锁, 具备互斥性, 在被锁的代码块上只能有一个线程访问共享变量   3. volatile不能保证变量的原子性, 即一组对共享变量的操作不具备事务(要么全部完成,要么全部不完成) 如 i++/i-- 即一个线程在进行一组操作中还没完成时, 其他线程也能进入这组操作对共享变量进行修改 而 synchronized则能保证一组对共享变量操作的原子性, 即这组操作全部完成,才能进行下一轮操作 即在被锁的代码块中只能允许一个线程去执行这组操作, 其他需要执行这组操作的线程会进入阻塞状态,等待其完成 总结:
Vincent-yuan
2021/07/16
7560
【DB笔试面试553】在Oracle中,什么是不可见索引?
索引维护是DBA的一项重要工作。当一个系统运行很长一段时间,经过需求变更、结构设计变化后,系统中就可能会存在一些不再被使用的索引,或者使用效率很低的索引。这些索引的存在,不仅占用系统空间,而且会降低事务效率,增加系统的负载。因此,需要找出那些无用或低效的索引,并删除它们(找出无用索引可以通过索引监控的方法)。但是,直接删除索引还是存在一定风险的。例如,某些索引可能只是在一些周期的作业中被使用到,而如果监控周期没有覆盖到这些作业的触发点,那么就会认为索引是无用的,从而将其删除。当作业启动后,可能就会对系统性能造成冲击。这时,可能就会手忙脚乱地去找回索引定义语句、重建索引。在Oracle 11g里,Oracle提供了一个新的特性来降低直接删除索引或者禁用索引的风险,那就是不可见索引(Invisible Indexes)。
AiDBA宝典
2019/09/29
6640
点击加载更多

相似问题

对于其他人来说,llvm中的变量是否可见?

12

C#调用其他类变量,但返回null (Unity3D)

20

变量在脚本检查器窗口中不可见

12

Java,类在其他包中可见,但在其他插件中不可见

22

Dictionary.ElementAt方法在某些类中可见,但在其他类中不可见

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

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

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文