SQL 取分组中的前几名

create table #aa(class varchar(10),name varchar(10),lang int,math int)
go

insert into #aa
select '1','a1',60,70
union all
select '1','a2',80,70
union all
select '1','a3',90,70
union all
select '1','a4',50,70
go

insert into #aa
select '2','b1',60,70
union all
select '2','b2',90,90
union all
select '2','b3',90,70
union all
select '2','b4',50,70

go

select * from #aa

--取每年级前一名的成级
select * from
    (select ROW_NUMBER() over(partition by class order by lang+math desc) rr, * from #aa ) a
where     rr<2
--取每年级前二名的成级
select * from
    (select ROW_NUMBER() over(partition by class order by lang+math desc) rr, * from #aa ) a
where     rr<3




### SQL高级分组函数的使用方法 #### 背景介绍 SQL 中的高级分组功能主要通过 `GROUP BY` 和窗口函数来实现复杂的数据汇总和分析操作。这些技术不仅能够满足基本的分组需求,还能提供更灵活的功能,比如按条件过滤分组后的数据、基于分区进行排序以及计算相对排名等。 --- #### 高级分组函数的核心概念 1. **聚合函数与 GROUP BY** 使用标准的 `GROUP BY` 子句可以对表中的记录按照某一列或多列进行分组,并应用聚合函数(如 `SUM()`、`AVG()` 等)来统计每组的结果[^1]。 2. **HAVING 过滤器** 在完成分组之后,可以通过 `HAVING` 来进一步筛选符合条件的分组结果。这一步类似于 `WHERE` 的作用,但它应用于已经分组并聚合过的数据集上。 3. **窗口函数 (Window Functions)** 窗口函数允许在不破坏原始表格结构的情况下执行复杂的计算。它们通常配合关键字 `OVER()` 使用,支持诸如 `PARTITION BY` 和 `ORDER BY` 的子句定义逻辑分组和排序方式[^3]。 4. **特定窗口函数:PERCENT_RANK()** 函数 `PERCENT_RANK()` 属于 Oracle 数据库提供的内置窗口函数之一,用于评估某条记录在其所属组内的百分位排名。其返回值范围介于 0 到 1 之间,表示当行相对于整个有序集合的位置[^4]。 --- #### 实现示例 以下是几个具体的例子展示如何利用上述提到的技术解决实际问题: ##### 示例 1: 基本分组加聚合运算 假设有一个销售订单表 (`sales`) ,其中包含字段 `region`, `product_id`, 及 `amount` 。我们希望知道每个地区的总销售额。 ```sql SELECT region, SUM(amount) AS total_sales FROM sales GROUP BY region; ``` 此查询会先依据地区名(`region`) 对所有交易记录分类,再分别求各区域金额总计数。 --- ##### 示例 2: 添加 HAVING 后续处理 继续沿用一场景,现在只关心那些累计收入超过 $10,000 的地理区划。 ```sql SELECT region, SUM(amount) AS total_sales FROM sales GROUP BY region HAVING SUM(amount) > 10000; ``` 这里引入了额外约束条件——仅保留满足给定阈值以上的组合项。 --- ##### 示例 3: 应用 WINDOW FUNCTION 计算累积比例 考虑同样背景下的业务诉求,即除了常规指标外还需要了解每一笔交易在整个区域内所占份额的变化趋势,则可借助 PERCENT_RANK 完成如下任务: ```sql SELECT product_id, amount, PERCENT_RANK() OVER ( PARTITION BY region -- 将数据分割成多个独立部分(此处为不同地域) ORDER BY amount DESC -- 每个片段内部依数值大小降序排列 ) as percent_rank_value FROM sales; ``` 该脚本首先把源资料依照指定维度切分成若干区块;其次,在每一个单元格里重新安排次序以便后续调用 PERCENT_RANK 方法得出相应比率得分^。 --- ##### 示例 4: 结合多层嵌套表达式构建复合视图 当面临更加棘手的需求时,例如既要呈现单件商品销量排行又要兼顾整体市场表现对比情况的话,那么就需要综合运用多种手段共同达成目标啦! ```sql WITH ranked_products AS ( SELECT product_id, region, amount, RANK() OVER(PARTITION BY region ORDER BY amount DESC) rank_num FROM sales ), total_region_sales AS( SELECT region, SUM(amount) tot_amt FROM sales GROUP BY region ) SELECT rp.product_id,rp.region,rp.amount,rp.rank_num,trs.tot_amt,(rp.amount/trs.tot_amt)*100 pct_of_total FROM ranked_products rp JOIN total_region_sales trs ON rp.region=trs.region WHERE rp.rank_num<=5 ; ``` 以上代码块先是创建了一个临时中间结果集用来存储各个产品所在大区内各自的畅销程度等级标签;紧接着又单独提出了各区总的营业额概况信息作为参照系最后两者相互关联起来从而最终形成一份既直观又能反映全局态势的新报表形式[^2]. --- ### 总结 通过对 SQL 提供的各种工具箱组件的有效组合搭配,我们可以轻松应对各种层次上的数据分析请求。无论是简单的计数还是深入挖掘隐藏模式背后的故事都变得触手可及。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值