sql server 分组后,取每组前1条数据

sql 排名开窗函数 ROW_NUMBER、DENSE_RANK、RANK、NTILE属于排名函数。
排名开窗函数可以单独使用ORDER BY 语句,也可以和PARTITION BY同时使用。

PARTITION BY用于将结果集进行分组,开窗函数应用于每一组。

ODER BY 指定排名开窗函数的顺序。在排名开窗函数中必须使用ORDER BY语句


http://www.cnblogs.com/lanzi/archive/2010/10/26/1861338.html

rank 跳过排名  dense_rank 继续排名

create table tb_test(name varchar(10),val int,memo varchar(20)) 
insert into tb_test values('a', 2, 'a2(a的第二个值)') 
insert into tb_test values('a', 1, 'a1--a的第一个值') 
insert into tb_test values('a', 3, 'a3:a的第三个值') 
insert into tb_test values('b', 1, 'b1--b的第一个值') 
insert into tb_test values('b', 3, 'b3:b的第三个值') 
insert into tb_test values('b', 2, 'b2b2b2b2') 
insert into tb_test values('b', 4, 'b4b4') 
insert into tb_test values('b', 5, 'b5b5b5b5b5') 
insert into tb_test values('b', 5, 'bb5') 
go

--方案1

select a.* from tb_test a where not exists(select 1 from tb_test where name = a.name and val > a.val) ;

select a.* from tb_test a,(select name,max(val) val from tb_test group by name) b where a.name = b.name and a.val = b.val order by a.name;

select a.* from tb_test a inner join (select name , max(val) val from tb_test group by name) b on a.name = b.name and a.val = b.val order by a.name 


--方案2 分组后 取每组前 2条数据
select * from (
SELECT  ROW_NUMBER()   
        over   
        (PARTITION By name order by val) as rowId,tb_test.*
FROM tb_test 
) t
where rowid <= 2

### SQL Server分组每组合并成一条记录的展示方法 在 SQL Server 中,可以通过多种方式实现将分组后的数据整合为每组一条记录的形式展示。以下是几种常见的解决方案: #### 使用 `FOR XML PATH` 实现字符串拼接 通过 `FOR XML PATH('')` 的语法可以将同一组内的多个字段值拼接成一个字符串。这种方法适用于需要将多行数据合并到单个字段中的场景。 ```sql SELECT GroupColumn, STUFF(( SELECT ',' + DetailColumn FROM TableName AS T2 WHERE T2.GroupColumn = T1.GroupColumn FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)') , 1, 1, '') AS ConcatenatedValues FROM TableName AS T1 GROUP BY GroupColumn; ``` 上述代码中,`STUFF` 函数用于移除最终结果多余的逗号[^2]。 --- #### 利用口函数获取每组的最大/最小记录 如果目标是从每一组中提特定的一条记录(如最大值或最小值),则可以借助口函数来完成此操作。例如,使用 `ROW_NUMBER()` 或其他排名函数筛选出符合件的数据。 ```sql WITH RankedData AS ( SELECT *, ROW_NUMBER() OVER (PARTITION BY GroupColumn ORDER BY SomeCriteria DESC) AS RowNum FROM TableName ) SELECT * FROM RankedData WHERE RowNum = 1; ``` 这里的关键在于 `ROW_NUMBER()` 函数会按照指定列进行区,并按另一列排序生成序号。最后仅保留每组的第一条记录[^1]。 --- #### 结合聚合函数与子查询 当需求涉及复杂的逻辑处理时,可采用嵌套子查询的方式来满足业务需求。比如计算某些指标后再将其作为新字段加入原表结构之中。 ```sql SELECT GroupColumn, MAX(SomeValue) AS MaxValue, STRING_AGG(DetailColumn, ', ') WITHIN GROUP (ORDER BY DetailColumn ASC) AS AggregatedDetails FROM TableName GROUP BY GroupColumn; ``` 注意:`STRING_AGG` 是从 SQL Server 2017 开始支持的功能,在较早版本中需改用述提到过的 `FOR XML PATH` 技巧替代它[^3]。 --- #### 总结说明 以上三种方案别针对不同类型的诉求提供了灵活应对策略——无论是简单的文本连接还是复杂的选择过滤均能妥善解决。实际应用过程中应依据具体环境特点选最合适的工具集加以实施。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值