sqlserver 查询记录根据人员考勤记录去重,当时只去重当天的,不同日期的可以重复,sql怎么写 求助
用分析函数row_number() over (partition by ... order by ...)给记录进行分组编号,按人员id和考勤日期进行分组(如果考勤日期带时分秒,需先截断到日),按时间升序排序;这样,就得到人员ID在同一考勤日期下的编号值(编号值是从1开始的),然后,只取编号值为1的记录。
创新互联专业为企业提供玉环网站建设、玉环做网站、玉环网站设计、玉环网站制作等企业网站建设、网页设计与制作、玉环企业网站模板建站服务,十余年玉环做网站经验,不只是建网站,更提供有价值的思路和整体网络服务。
SQL类似:
select s.id, s.name, s.date, s.card_time
from (
select d.id, d.name, d.date, d.card_time,
row_number() over (partition by d.id, d.date order by d.card_time) as row_idx
from data_table d
) s
where s.row_idx = 1
SQLSERVER分页查询关于使用Top方式和row_number()解析函数的不同
临近春节,心早已飞了不在工作上了,下面小编给大家整理些数据库的几种分页查询。
Sql
Sever
2005之前版本:
select
top
页大小
*
from
表名
where
id
not
in
(
select
top
页大小*(查询第几页-1)
id
from
表名
order
by
id
)
order
by
id
例如:
select
top
10
*
--10
为页大小
from
[TCCLine].[dbo].[CLine_CommonImage]
where
id
not
in
(
--40是这么计算出来的:10*(5-1)
--
页大小*(查询第几页-1)
select
top
40
id
from
[TCCLine].[dbo].[CLine_CommonImage]
order
by
id
)
order
by
id
结果为:
Sql
Sever
2005及以上版本,多了个分页查询方法:
/*
*
firstIndex:起始索引
*
pageSize:每页显示的数量
*
orderColumn:排序的字段名
*
SQL:可以是简单的单表查询语句,也可以是复杂的多表联合查询语句
*/
select
top
pageSize
o.*
from
(select
row_number()
over(order
by
orderColumn)
as
rownumber,*
from(SQL)
as
o
where
rownumberfirstIndex;
例如:
select
top
10
numComImg.*
from
(
select
row_number()
over(order
by
id
asc)
as
rownumber,*
from
(select
*
FROM
[TCCLine].[dbo].[CLine_CommonImage])
as
comImg)
as
numComImg
where
rownumber40
结果:
这两个方法,就仅仅是多了一列
rewnumber
吗?当然不是,来看下内部差别吧:
在两个SQL上,分别加入以下SQL,并使用MS的“包括执行计划”,便于查看执行详情:
SET
STATISTICS
TIME
ON
GO
要执行的SQL:
SET
STATISTICS
TIME
ON
GO
select
top
10
numComImg.*
from
(
select
row_number()
over(order
by
id
asc)
as
rownumber,*
from
(select
*
FROM
[TCCLine].[dbo].[CLine_CommonImage])
as
comImg)
as
numComImg
where
rownumber40
SET
STATISTICS
TIME
ON
GO
select
top
10
*
--10
为页大小
from
[TCCLine].[dbo].[CLine_CommonImage]
where
id
not
in
(
--40是这么计算出来的:10*(5-1)
--
页大小*(查询第几页-1)
select
top
40
id
from
[TCCLine].[dbo].[CLine_CommonImage]
order
by
id
)
order
by
id
执行之后,查看执行计划:
看得出,两个同样功能的SQL,执行时,使用
row_number()
的,要比是用
纯TOP方式的,查询开销少得多,上图显示
28:72,纯top方式,使用了两次聚集扫描。
再来看下执行时间信息:
row_number()方式的:
纯top方式:
相比之下,还是row_number()解析函数效率比较高写。
以上所述是小编给大家分享的SQLSERVER分页查询关于使用Top方式和row_number()解析函数的不同,希望对大家有所帮助。
SqlServer函数的系统函数
newid 无参数
返回一个GUID(全局唯一表示符)值
例如:select newid()
返回:2E6861EF-F4DB-4FFE-86EB-637482FE982J2
isnumeric (任意表达式)
判断表达式是否为数值类型或者是否可以转换成数值。
是:返回1,不是:返回0
例如:select isnumeric(1111) 返回 1
select isnumeric('123rr') 返回 0
select isnumeric('123') 返回 1
isnull (任意表达式1,任意表达式2)
如果任意表达式1不为NULL,则返回它的值;否则,在将任意表达式2的类型转换为任意表达式1的类型(如果这两个类型不同)后,返回任意表达式2的值。
例如:select isnull(null,N'没有值') 返回 没有值
select isnull(N'具体的值',N'没有值') 返回 具体的值
isdate (任意表达式)
确定输入表达式是否为有效日期或可转成有效的日期;
是:返回1,不是:返回0
例如:select isdate(getdate()) 返回1
select isdate('2013-01-02') 返回1
select isdate('198') 返回0
SqlServer常用函数
1、CONVERT()
函数
?
1
CONVERT(data_type(length),data_to_be_converted,style)
data_type(length)
规定目标数据类型(带有可选的长度)。data_to_be_converted
含有需要转换的值。style
规定日期/时间的输出格式。
可以使用的
style
值:点击打开链接
2、DATEADD()
函数
点击打开链接
3、CAST()
函数
?
1
2
Syntax
for
CAST:
CAST
(
expression
AS
data_type
[
(
length
)
]
)
expression
任何有效的表达式。
data_type
目标数据类型。
这包括
xml、bigint
和
sql_variant。
不能使用别名数据类型。
length
指定目标数据类型长度的可选整数。
默认值为
30。
CONVERT()
函数与CAST()
函数详细信息:点击打开链接
当前文章:sqlserver分析函数,Sqlserver函数
网址分享:http://scgulin.cn/article/hdscis.html