
正文
sqlserver开窗,sqlserver开窗函数有哪些
提示:扫一扫查出行【扫一扫了解最新限行尾号】
复制提示
求SQL 获取最小值 对应那一列的所有数据
是什么数据库?
select a.客户,
a.商品,
a.单价,
a.日期
from (select 客户,
商品,
单价,
日期,
row_number() over(partition by 客户, 商品 order by 单价) rn
from 表) a
where a.rn = 1
相关问答
Q1: 使用sql的分组函数之后,怎样在被分组的数据
sqlserver 分组函数,请参阅:
sqlserver分组开窗函数的用法
用这些函数,分组后,可以实现分组内部编号排序,例:
create table A ([姓名] nvarchar(20),[订单数] int,[订单日期] datetime )
go
insert into A ([姓名],[订单数],[订单日期]) values ('',1900,'2014-5-6')
insert into A ([姓名],[订单数],[订单日期]) values ('',1800,'2018-5-6')
insert into A ([姓名],[订单数],[订单日期]) values ('',1800,'2018-5-6')
insert into A ([姓名],[订单数],[订单日期]) values ('小张',100,'2013-5-6')
insert into A ([姓名],[订单数],[订单日期]) values ('小明',2600,'2013-1-6')
insert into A ([姓名],[订单数],[订单日期]) values ('小明',1800,'2013-5-6')
insert into A ([姓名],[订单数],[订单日期]) values ('小李',888,'2017-3-6')
go
/*row_number 返回分组后的连续排序,不会出现重复的排序值*/
select row_number() over(partition by [姓名] order by [订单日期] desc ) as keyId,* from A
/*rank 返回分组后的连续排序,会出现跳跃排序值*/
select rank() over(partition by [姓名] order by [订单日期] desc ) as keyId,* from A
/*dense_rank 返回分组后的连续排序,不会出现跳跃排序值,但是会出现重复的排序值*/
select dense_rank() over(partition by [姓名] order by [订单日期] desc ) as keyId,* from A
go
truncate table A
drop table A
Q2: sqlserver根据某一个字段进行求和运算后去掉重复的数据
你的time,不一样。如果去掉重复的。是time这个字段不要,还是要哪一条数据?
你用的开窗函数,一般都是用来做排序的,去掉重复的,还是要用分组。
Q3: 求一条SQL语句...
/*
oracle 和sqlserver中有个开窗函数 over可以实现这个功能
*/
select * from
(
select t1.id,t1.name,t1.age,t1.sex,t2.title,t2.adddate,
row_number() over(partition by t1.id order by t2.adddate desc) r1
from user t1,article t2
where t1.id = t2.id
) t
where r1 = 1
/*
sqlserver 2000以前的话稍微有点麻烦
*/
select t2.id,t2.name,t2.age,t2.sex,t3.title,t3.adddate
from (select id,max(adddate) adddate from article group by id ) t1,
user t2, article t3
where t1.id = t2.id
and t1.id = t3.id
and t1.adddate = t3.adddate
Q4: sql 语句查询 前5名后5名的成绩
不知道你的是什么数据库,我用oracle的写法了。
两种办法:
分别求最大和最小,然后union all
select * from(select * from table order by 成绩) where rownum=5
union all
select * from(select * from table order by 成绩 desc) where rownum=5
利用排序,找到每个人的位置,然后输出。排序的方法很多,可以用rownum排序,也可以用row_number()over()排序
我用row_number()over()写一个
select a.姓名,a.成绩 from
(select row_number()over(order by 成绩) num,姓名,成绩 from table) a where a.num=5 or
a.num=(select count(*)-5 from table)
我没实验,不过就算有问题也应该不大。
sqlserver的版本是啥?是2005以上么?如果是
那么利用那个row_number的应该也可以,不过为了让分数一样的人都出来,那么最好改为
这种情况是假设前五出现分数相同的话,假如前五名有六个人的情况,不过我没有输出名次,另外我上面的那种写法也可以试试,sqlserver好像也可以。
不过如果你要是sql2005以前的版本那时sqlserver还没有这几个开窗函数,那就稍微有点麻烦了。
select 姓名,成绩 from
select rank()over(order by 成绩) num,rank()over(order by 成绩 desc) num_desc,姓名,成绩 from table) a where a.num=5 or a.num_desc=5 order by 成绩 desc
Q5: sqlserver 计算设备运行时长?
测试数据图片在下面??。该解决方案使用了开窗函数lead,mysql8.0支持,我这是在hive上测试的。
大致思路为,只统计running-stopped的运行时间,stoppe-running的过滤掉,也不需要计算。
select
id,sum(next_diff_time)/60 running_time
from (
select id,lead(unix_timestamp(datetime),1,-1) over(partition by id order by datetime)-unix_timestamp(datetime) next_diff_time,status
from test
) tt
where status!='stopped'
group by id;







