多层分组排序问题

已知原表数据如下:

要求实现如下效果:

--创建表
create table tmp as
select ‘火腿肠‘ c1, ‘销售一部‘ c2,‘老王‘   c3, 1.5 c4 from dual union all
select ‘玉米‘   c1, ‘销售五部‘ c2,‘B老刘‘  c3, 1   c4 from dual union all
select ‘笔记本‘ c1, ‘销售一部‘ c2,‘老王‘   c3, 3   c4 from dual union all
select ‘笔记本‘ c1, ‘销售七部‘ c2,‘老张‘   c3, 3   c4 from dual union all
select ‘桌子‘   c1, ‘销售九部‘ c2,‘老孙‘   c3, 4   c4 from dual union all
select ‘火腿肠‘ c1, ‘销售五部‘ c2,‘老刘‘   c3, 1.5 c4 from dual union all
select ‘火腿肠‘ c1, ‘销售四部‘ c2,‘老赵‘   c3, 1.5 c4 from dual union all
select ‘玉米‘   c1, ‘销售四部‘ c2,‘老李‘   c3, 1   c4 from dual union all
select ‘笔记本‘ c1, ‘销售七部‘ c2,‘老张‘   c3, 3   c4 from dual union all
select ‘玉米‘   c1, ‘销售五部‘ c2,‘A老谭‘  c3, 1   c4 from dual union all
select ‘玉米‘   c1, ‘销售一部‘ c2,‘老柳‘   c3, 1   c4 from dual union all
select ‘玉米‘   c1, ‘销售一部‘ c2,‘老柳‘   c3, 1   c4 from dual union all
select ‘玉米‘   c1, ‘销售一部‘ c2,‘老王‘   c3, 1   c4 from dual;

--写法1:
select rn,c1,rn2,c2,rn3,c3
  from(select c1,c2,c3,
              dense_rank()over(order by sm desc) rn,
              dense_rank()over(partition by c1 order by sm2 desc) rn2,
              row_number()over(partition by c1,c2 order by sm3 desc) rn3
         from(select distinct t1.c1,t1.c2,t1.c3,
                     sum(t1.c4)over(partition by t1.c1) sm,
                     sum(t1.c4)over(partition by t1.c1,t1.c2) sm2,
                     sum(t1.c4)over(partition by t1.c1,t1.c2,t1.c3) sm3
                from tmp t1
             )
       )
where rn <= 3 and rn2 <= 3 and rn3 = 1
order by rn,rn2,rn3;

--写法2
select rn,c1,rn2,c2,rn3,c3
  from(select c1,c2,c3,
              dense_rank()over(order by sm desc) rn,
              dense_rank()over(partition by c1 order by sm2 desc) rn2,
              dense_rank()over(partition by c1,c2 order by sm3 desc) rn3
         from(select distinct t1.c1,t1.c2,t1.c3,
                     sum(t1.c4)over(partition by t1.c1) sm,
                     sum(t1.c4)over(partition by t1.c1,t1.c2) sm2,
                     sum(t1.c4)over(partition by t1.c1,t1.c2,t1.c3) sm3
                from tmp t1
             )
       )
where rn <= 3 and rn2 <= 3 and rn3 = 1
order by rn,rn2,rn3;
时间: 2024-11-06 09:52:00

多层分组排序问题的相关文章

简化多层分组关联计算的sql

在数据库应用开发中,我们经常需要面对复杂的SQL式计算,比如多层分组中的关联计算.由于SQL分组时必须同时汇总,并且不能进行对象式关联访问,因此处理这类问题会比较复杂,只能用窗口函数嵌套多层的子查询的高级技巧来实现.集算器支持真正的分组,直观的对象式关联访问,解决这类问题更加容易. 分组关联在实际业务中遇到的较多,比如http://forums.bit-tech.net/showthread.php?t=207052.下面以链接中的实际业务为蓝本设计一个更通用的例子,用来说明集算器实现分组关联的

【案例分享】电力设备生产数据的多层分组统计报表实现

多层分组统计报表即按照不同的数据字段,形成多级分组,并分层级进行合计. 传统报表的实现方式大多基于 Table 控件,虽然可实现多个分组功能,但在报表显示方面有限制,只能呈现上下级的分组,而现代的复杂报表的需求,通常是左右级嵌套,有时甚至要求相同内容的单元格合并,使用 Table 控件,有太多的局限,有了矩表控件,通过简单的拖拽就能轻松实现多层分组报表,不管有多少个分组和分组小计都能简单解决. 下面会通过一个具体的案例,使用葡萄城报表中的矩表控件来讲解实现多层分组统计报表. (一)原始数据 (二

HIVE分组排序问题

答案: hive> select *,row_number() over (partition by product_no order by start_time desc) from table1; 知识点: 1.row_number hive (test)> select *, row_number() over (partition by sub order by score) as od from t;  2.rank hive (test)> select *, rank() 

报表设计--分组报表-多层分组-横向扩展

一.新建数据源 参展网格式报表设计 二.操作步骤 在B2单元格中填写=ds.group(TYear),设置为横向扩展: 在B3单元格中填写=ds.group(tjd),设置为横向扩展: 在B4单元格中填写=ds.group(TMonth),设置为横向扩展: 在B5单元格中填写=ds.group(Tmoney) 三.报表计算后预览效果

报表设计--分组报表-多层分组-数据汇总

一.新建数据源 二.操作步骤 本实例中: to函数是生成连续的整数数据,sum函数是求和,针对单元格函数支持大小写.中文符号: D1单元格填写=to(10,11)设置为横向扩展 D2单元格填写=to(20,21)设置为横向扩展 A4单元格填写=TO(1,3)设置为纵向扩展 B4单元格填写=TO(6,7)设置为纵向扩展 C4单元格填写=TO(9,10)设置为纵向扩展 E1单元格填写=sum(d1{}),求所有横向扩展后D1单元格的数据和 E2单元格填写=sum(d2{}),求所有横向扩展后D2单元

ORACLE分组查询和统计等

select flow_id,rw from (select t.flow_id ,rownum as rw from apex_030200.wwv_flow_list_templates t)  where rw >= 5 1.rownum只能用<如果使用>加别名 2.子查询引用只能在查询出的结果中引用,比如子查询没有查出flow_id,外层不能用,另外外层不能引用内层的t 3.薪水前三名,内层查出薪水 order desc的虚表外层使用rownum<3 4.merge可以实现

pandas分组与聚合

Pandas分组与聚合 分组 (groupby) 对数据集进行分组,然后对每组进行统计分析 SQL能够对数据进行过滤,分组聚合 pandas能利用groupby进行更加复杂的分组运算 分组运算过程:split->apply->combine 拆分:进行分组的根据 2.应用:每个分组运行的计算规则 3.合并:把每个分组的计算结果合并起来 示例代码: import pandas as pd import numpy as np dict_obj = {'key1' : ['a', 'b', 'a'

jQgrid问题总结

最近一段时间一直在使用jqgrid这个免费的插件,网上的资料也比较多.比较全,但是这里还是整理几个自己在开发过程中遇到的小问题. 1.自动换行 一行数据过多需要自动根据内容换行时,如果遇到在表格中的汉字换行或者空格换行的问题,可以在style标签中插入下面代码: 1 .ui-jqgrid tr.jqgrow td 2 { 3 white-space: normal !important; 4 height:auto; 5 vertical-align:central; 6 padding-top

基本的sed命令

基本的sed命令 sed命令集合由25个命令组成,本文档我们介绍4个新的编辑命令:d删除 a追加 i插入 c更改.还要整一下改变脚本中流程控制(例如:决定下一步执行哪个命令)的方式. sed命令的两点语法: 行地址对于任何命令都是可选的.它可以是一个模式,被描述为由斜杠.行号或者行寻址符合括住的正则表达式.大多数的sed命令能接受由逗号分隔的两个地址,这两个地址,这两个地址用来标识行的范围.这些命令的语法格式为: [address]command 有一些命令只接受单个行地址.它们不能应用于某个范