sql:用group by分组后,每组随意取一个记录?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sql:用group by分组后,每组随意取一个记录?相关的知识,希望对你有一定的参考价值。

如题,建立对某表分组视图,想在视图结果中显示一个既不是分组列也不适合用聚合函数的列,结果中该列的值可以是原分组中该列任意一行的值(注意:不是强调是随机值),主要原因是缺乏一个根据一组值随意产生一个值的聚合函数。
sql 语句如下:
SELECT 楼栋id, MAX(层高) AS 层高, SUM(建筑面积) AS 建筑面积, 随意聚合函数(楼栋名称),
随意聚合函数(管理人员联系方式)
FROM dbo.进阶视图_楼栋对用房单位
GROUP BY 楼栋id

本人使用的是sql server 2000,如各位有能实现以上功能的自定义函数,请不吝指教。
下面是我的解决方案,每次需要针对条件单独设计函数,效率也很低。
CREATE FUNCTION 根据楼栋id产生楼栋名称 (@楼栋id int)
RETURNS varchar(50) AS
BEGIN
declare @Str varchar(50)
set @Str = ''
select top 1 @Str = [楼栋名称] from 进阶视图_楼栋对用房单位
where [楼栋id] = @楼栋id
return @Str
END
其实就是求一个——”通用的“自定义聚合函数,功能是实现根据一组值产生任意值。

参考技术A select 楼栋id,楼栋名称,管理人员联系方式,层高,面积
from (
select 楼栋id,楼栋名称,管理人员联系方式,row_number() over(partition by 楼栋id order by 层高 desc) rn,层高,SUM(建筑面积) OVER(PARTITION BY 楼栋id) as 面积
from dbo.进阶视图_楼栋对用房单位
) a
where rn=1;追问

over无法识别,丢失from子句。
row_number() over(partition by COL )as rn

在什么环境下可以用啊?
我是sql server 2000

追答

2005以上才有的函数,
2000没有的

追问

麻烦再想想有没有更通用的解决办法啊?

追答

这个就是通用的,sqlserver2005以上都能用,oracle也能用

sqlserver2000现在很少用到了,的确是不方便用

追问

这个写着就比group by 麻烦,需要写在from子句里面,而且有group by有几个聚合函数就要改写几个OVER(PARTITION by COL) 。
要是同时group by 的时候用多个col,改写不是要很长很累赘?

另:你写的语句里,层高没有聚合是因为前一句“order by 层高 desc”么?

追答

我用的是分析函数,函数内部做了分组,然后排序编号
然后取出每组排名第一的

本回答被提问者采纳
参考技术B 如果想写一个对所有表都能适用的自定义函数,有些困难,但如果只针对某一个表,可以用一个输入参数表示是哪个字段,在函数内部用IF .... else 来判断追问

就是求一个——”通用的“自定义聚合函数

sqlserver2008,sql编程,group by 用法

参考技术A 语句中有group
by的话,说明是进行分组聚合查询,因此select后的属性只能是group
by后面的分组属性和在其它字段上的聚合函数结果(avg平均值,sum求和,count计数等),而order
by后的属性也必须是分组属性或聚合结果,因为此时是对分组后的结果进行排序。
group
by相当于对数据分组,分组属性有多少各不同的值就有多少各分组,每个分组是结果集中一条记录

以上是关于sql:用group by分组后,每组随意取一个记录?的主要内容,如果未能解决你的问题,请参考以下文章

group by分组后获得每组中时间最大的那条记录

sql取出每个分组的前几条

Mysql 分组以后取每组的前三名数据

sql中group by 是啥意思啊?请教谢谢

sql如何取group by 分组的多条记录只取最上面的一条!

MSSQL 分组后取每组第一条(group by order by)