分组 根据某一列进行排序,根据shopid分组,用createTime排序,返回row_number()序号 select no =row_number() over (partition by shopId order by createTime desc), * from Goods_info

over不能单独使用,要和分析函数:rank(),dense_rank(),row_number()等一起使用。
其参数:over(partition by columnname1 order by columnname2)
含义:按columname1指定的字段进行分组排序,或者说按字段columnname1的值进行分组排序。
例如:employees表中,有两个部门的记录:department_id =10和20
select department_id,rank() over(partition by department_id order by salary) from employees就是指在部门10中进行薪水的排名,在部门20中进行薪水排名。如果是partition by org_id,则是在整个公司内进行排名。

以下是个人见解:

sql中的over函数和row_numbert()函数配合使用,可生成行号。可对某一列的值进行排序,对于相同值的数据行进行分组排序。

执行语句:select row_number() over(order by AID DESC) as rowid,* from bb

SELECT
House.HouseId,
House.HouseName,
House.iconFlag,
House.orderId,
House.HouseJingYingFW,
House.HouseTel,
House.HouseCelPhone,
dbo.fnGetDistance(
118.328213, 35.081728, House.longitude,
House.latitude
) as jl,
Goods.originalPrice as levelCount,
Goods.presentPrice as levelAmount
FROM
House
LEFT JOIN (
select shopId,originalPrice,presentPrice
from (select no =row_number() over (partition by shopId order by createTime desc), * from Goods_info WHERE IsClear = 1)t
where no=1
) Goods on shopId = House.HouseId
where
(
House.isdel is null
or House.isdel = 0
)
and House.status = 1
and House.houseStatus <> 0
and House.housetype like ‘%1%‘
order by
House.orderId desc,
jl ASC

IF OBJECT_ID (‘dbo.fnGetDistance‘) IS NOT NULL
DROP FUNCTION dbo.fnGetDistance
GO

--计算地球上两个坐标点(经度,纬度)之间距离sql函数
CREATE FUNCTION [dbo].[fnGetDistance](@LatBegin REAL, @LngBegin REAL, @LatEnd REAL, @LngEnd REAL) RETURNS FLOAT
AS
BEGIN
--距离(千米)
DECLARE @Distance REAL
DECLARE @EARTH_RADIUS REAL
SET @EARTH_RADIUS = 6378.137
DECLARE @RadLatBegin REAL,@RadLatEnd REAL,@RadLatDiff REAL,@RadLngDiff REAL
SET @RadLatBegin = @LatBegin *PI()/180.0
SET @RadLatEnd = @LatEnd *PI()/180.0
SET @RadLatDiff = @RadLatBegin - @RadLatEnd
SET @RadLngDiff = @LngBegin *PI()/180.0 - @LngEnd *PI()/180.0
SET @Distance = 2 *ASIN(SQRT(POWER(SIN(@RadLatDiff/2), 2)+COS(@RadLatBegin)*COS(@RadLatEnd)*POWER(SIN(@RadLngDiff/2), 2)))
SET @Distance = @Distance * @EARTH_RADIUS
--SET @Distance = Round(@Distance * 10000) / 10000
RETURN @Distance
END
GO

SQL中Group分组获取Top N方法实现

有产品表,包含id,name,city,addtime四个字段,因报表需要按城市分组,统计每个城市的最新10个产品,便向该表中插入了100万数据,做了如下系列测试:

www.2cto.com

CREATE TABLE [dbo].[products](

[id] [int] IDENTITY(1,1) NOT NULL,

[name] [nvarchar](50) NULL,

[addtime] [datetime] NULL,

[city] [nvarchar](10) NULL,

CONSTRAINT [PK_products] PRIMARY KEY CLUSTERED

(

[id] ASC

)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]

) ON [PRIMARY]

1、采用row_number方法,执行5次,平均下来8秒左右,速度最快。

www.2cto.com

select no, id,name,city

from  (select  no =row_number() over (partition by city order by addtime desc), * from products)t

where no< 11 order by city asc,addtime desc

2、采用cross apply方法,执行了3次,基本都在3分5秒以上,已经很慢了。

select distinct b.id,b.name,b.city from products a

cross apply (select top 10 * from products where city = a.city order by  addtime desc) b

3、采用Count查询,只执行了两次,第一次执行到5分钟时,取消任务执行了;第二次执行到13分钟时,没有hold住又直接停止了,实在无法忍受。

select id,name,city from products a

where (  select count(city) from products where a.city = city and addtime>a.addtime) < 10

order by city asc,addtime desc

4、采用游标方法,这个最后测试的,执行了5次,每次都是10秒完成,感觉还不错。

declare @city nvarchar(10)

create table #Top(id int,name nvarchar(50),city nvarchar(10),addtime datetime)

declare mycursor cursor for

select  distinct city from products order by city asc

open mycursor

fetch next from mycursor into @city

while @@fetch_status =0

begin

insert into #Top

select top 10 id,name,city,addtime from products where city = @city

fetch next from mycursor into @city

end

close mycursor

deallocate mycursor

Select * from #Top order by city asc,addtime desc

drop table #Top

通过上述对比不难发现,在面临Group获取Top N场景时,可以首选row_number,游标cursor其次,另外两个就基本不考虑了,数据量大的时候根本没法使用。

时间: 2024-10-10 02:53:30

分组 根据某一列进行排序,根据shopid分组,用createTime排序,返回row_number()序号 select no =row_number() over (partition by shopId order by createTime desc), * from Goods_info的相关文章

ROWNUMBER() OVER( PARTITION BY COL1 ORDER BY COL2)用法,先分组,然后在组内排名,分组计算等

ROWNUMBER() OVER( PARTITION BY COL1 ORDER BY COL2)用法 今天在使用多字段去重时,由于某些字段有多种可能性,只需根据部分字段进行去重,在网上看到了rownumber() over(partition by col1 order by col2)去重的方法,很不错,在此记录分享下: row_number() OVER ( PARTITION BY COL1 ORDER BY COL2) 表示根据COL1分组,在分组内部根据 COL2排序,而此函数计算

18 12 06 sql 的 基本语句 查询 条件查询 逻辑运算符 模糊查询 范围查询 排序 聚合函数 分组 分页 连接查询 自关联 子查询

-- 数据的准备 -- 创建一个数据库 create database python_test charset=utf8; -- 使用一个数据库 use python_test; -- 显示使用的当前数据是哪个? select database(); -- 创建一个数据表 -- students表 create table students( id int unsigned primary key auto_increment not null, name varchar(20) default

Excel小技巧-你是否只知道表格按列排序?其实也可以按行排序!excel数据按行排序

Excel小技巧-你是否只知道表格按列排序?其实也可以按行排序!excel数据按行排序.系统默认情况下,数据都是按列进行排序的,可以通过简单的操作,让其进行按行进行排序. [解决方法,教程视频资料如下] 本教程视频资料来源:http://edu.51cto.com/course/15404.html 完整博客资料:http://blog.51cto.com/13172026/2292179 完整视频资料:http://edu.51cto.com/lecturer/13162026.html 原文

Oracle分组后取某列最大值的行数据

select * from ( select last_comment, row_number() over(partition by employeeid,roadline,stationname order by logindate desc) rn from reocrd ) t where t.rn <=1 这段的意思是,将reocrd表根据员工工号( employeeid),线路(,roadline),站点名称(stationname)分组后,取登录日期(logindate) 最大的那

列表框、分组列表框、标签(label)、分组框(fieldset)、框架(frameset)

列表框(select) 下拉列表,用户可以从一些可选项中选择. 示例:简单的下拉列表 <select name="country"> <option value="America">美国</option> <option value="China" selected="selected">中国</option> <option value="India

复习数据结构:排序算法(七)——桶排序

桶排序是一种稳定的排序方法,也是一种外排序. 桶排序的时间复杂度:最坏情况运行时间:当分布不均匀时,全部元素都分到一个桶中,则O(n^2),当然[算法导论8.4-2]也可以将插入排序换成堆排序.快速排序等,这样最坏情况就是O(nlgn).最好情况运行时间:O(n). 也就说,前面介绍的排序算法要么是O(n^2),要么是O(nlogn),只有桶排序是可能实现O(n)排序的,但是对数据是有要求的. 基本思想:是将阵列分到有限数量的桶子里.每个桶子再个别排序(有可能再使用别的排序算法或是以递回方式继续

(高效率排序算法一)并归排序

归并排序 归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用.将已有序的子序列合并,得到完全有序的序列:即先使每个子序列有序,再使子序列段间有序.若将两个有序表合并成一个有序表,称为二路归并. 归 并过程为:比较a[i]和a[j]的大小,若a[i]≤a[j],则将第一个有序表中的元素a[i]复制到r[k]中,并令i和k分别加上1:否则将第二 个有序表中的元素a[j]复制到r[k]中,并令j和k分别加上1,如此循环下去,直

排序算法(3)--Insert Sorting--插入排序[3]--Shell Sort--希尔排序

1.基本思想 希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序:随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止. 2.实现原理 对于n个待排序的数列,取一个小于n的整数gap(gap被称为步长)将待排序元素分成若干个组子序列,所有距离为gap的倍数的记录放在同一个组中:然后,对各组内的元素进行直接插入排序. 这一趟排序完成之后,每一个组的元素都是有序的.然后减小gap的值,并重复执行上述的分组和排序.重复这样的操作,当gap=1时

常用排序法之一 ——冒泡排序法和选择排序法

语言中,常用的算法有:冒泡排序.快速排序.插入排序.选择排序.希尔排序.堆排序以及归并排序等等.那么从这篇开始,我将分别总结下这几种排序法. 先交代一下,我们将要排序的数组定义为arr[N],即数组arr[]包含N个元素. ## 冒泡排序法(Bubblesort) ## 所谓排序法,就是对一组无序的序列进行有序的排序(从大到小或者从小到大),那么什么叫冒泡排序法,冒泡排序法又是怎么实现数组的有序排列呢. 冒泡排序法的具体实现方法是这样的,从数组的第一个元素`arr[0]`开始,两两比较**(`a