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
其实就是求一个——”通用的“自定义聚合函数,功能是实现根据一组值产生任意值。
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”么?
我用的是分析函数,函数内部做了分组,然后排序编号
然后取出每组排名第一的
就是求一个——”通用的“自定义聚合函数
sqlserver2008,sql编程,group by 用法
参考技术A 语句中有groupby的话,说明是进行分组聚合查询,因此select后的属性只能是group
by后面的分组属性和在其它字段上的聚合函数结果(avg平均值,sum求和,count计数等),而order
by后的属性也必须是分组属性或聚合结果,因为此时是对分组后的结果进行排序。
group
by相当于对数据分组,分组属性有多少各不同的值就有多少各分组,每个分组是结果集中一条记录
以上是关于sql:用group by分组后,每组随意取一个记录?的主要内容,如果未能解决你的问题,请参考以下文章