求助关于sql一段时间内重复记录的问题

时间:2023-01-08 19:25:51
我有一个表 格式如下
uid    uscore      utime
1 8800 2013-10-12 10:49:04
3 11300 2013-10-15 20:44:58
5 7200 2013-10-14 16:06:09
6 16400 2013-10-18 14:57:43
6 16300 2013-10-16 14:57:43
5 7100 2013-10-16 16:06:09
3 11200 2013-10-16 20:44:58
6 16100 2013-10-18 14:57:43
1 8300 2013-10-16 10:49:04

uid 用户id
uscore 得分
utime 得分时间

用户每天可以答题多次,每次答完题会自动记录到数据表,
也就是说同一天该用户会有多条信息,得分也不同
我想查询每天用户得分排行榜,答题多次的用户只显示最高分数

从昨天开始在网上找查询代码 都不合适
如下 
select UID,UScore,Utime from table a where UScore=(select max(UScore) from table where UID=a.UID) order by UScore

得到的是 所有时间 用户得分的排行榜

如果想查询每天的 应该怎么写,我加了时间范围进去,在order by UScore前面加入

and (Utime BETWEEN  '2013/10/18' and '2013/10/19')

查询出的是上面总排行内 我所指定时间范围的一条数据,

也就是说 只有每个用户的最高得分,但不一定是我指定的时间范围内的最高分,

在指定时间范围内,数据库内还有其他用户信息,

写的有点啰嗦,现在脑子很乱,不知道该怎么办好,

请问各位高手,这个范围应该怎么写呢?

30 个解决方案

#1


日期筛选你自己加where条件即可
----------------------------------------------------------------
-- Author  :DBA_Huangzj(發糞塗牆)
-- Date    :2013-10-22 17:10:34
-- Version:
--      Microsoft SQL Server 2012 (SP1) - 11.0.3128.0 (X64) 
-- Dec 28 2012 20:23:12 
-- Copyright (c) Microsoft Corporation
-- Enterprise Edition (64-bit) on Windows NT 6.2 <X64> (Build 9200: ) (Hypervisor)
--
----------------------------------------------------------------
--> 测试数据:[huang]
if object_id('[huang]') is not null drop table [huang]
go 
create table [huang]([uid] int,[uscore] int,[utime] datetime)
insert [huang]
select 1,8800,'2013-10-12 10:49:04' union all
select 3,11300,'2013-10-15 20:44:58' union all
select 5,7200,'2013-10-14 16:06:09' union all
select 6,16400,'2013-10-18 14:57:43' union all
select 6,16300,'2013-10-16 14:57:43' union all
select 5,7100,'2013-10-16 16:06:09' union all
select 3,11200,'2013-10-16 20:44:58' union all
select 6,16100,'2013-10-18 14:57:43' union all
select 1,8300,'2013-10-16 10:49:04'
--------------开始查询--------------------------

select *
 from [huang] a
 WHERE EXISTS (SELECT 1 FROM (SELECT [uid],MAX([uscore])[uscore],CONVERT(CHAR(10),[utime],23) [utime] FROM huang GROUP BY  [uid],CONVERT(CHAR(10),[utime],23))b
 WHERE CONVERT(CHAR(10),a.[utime],23)=b.utime AND a.[uid]=b.[uid] AND a.uscore=b.uscore)
----------------结果----------------------------
/* 
uid         uscore      utime
----------- ----------- -----------------------
1           8800        2013-10-12 10:49:04.000
3           11300       2013-10-15 20:44:58.000
5           7200        2013-10-14 16:06:09.000
6           16400       2013-10-18 14:57:43.000
6           16300       2013-10-16 14:57:43.000
5           7100        2013-10-16 16:06:09.000
3           11200       2013-10-16 20:44:58.000
1           8300        2013-10-16 10:49:04.000
*/

#2



SELECT uid,MAX(uscore) AS uscore,CONVERT(VARCHAR(10),utime,120) AS utime 
FROM tb WITH(NOLOCK)
GROUP BY uid,CONVERT(VARCHAR(10),utime,120)
ORDER BY MAX(uscore) DESC

#3




if object_id('Tempdb..#t') is not null drop table #t
 create table #t(
[uid] int   null,
[uscore] int null,
[utime] datetime null

Insert Into #t
select 1,8800,'2013-10-12 10:49:04' union all
select 3,11300,'2013-10-15 20:44:58' union all
select 5 ,7200,'2013-10-14 16:06:09' union all
select 6 ,16400,'2013-10-18 14:57:43' union all
select 6 ,16300,'2013-10-16 14:57:43' union all
select 5 ,7100,'2013-10-16 16:06:09' union all
select 3 ,11200,'2013-10-16 20:44:58' union all
select 6 ,16100,'2013-10-18 14:57:43' union all
select 1 ,8300,'2013-10-16 10:49:04'
 
;with cte as(
select * ,row_number() over(partition by [uid] order by [uscore] desc) rownumberid from #t  
where (Utime BETWEEN  '2013/10/18' and '2013/10/19')
)
select * from cte where rownumberid=1
----------------
(9 行受影响)
uid         uscore      utime                   rownumberid
----------- ----------- ----------------------- --------------------
6           16400       2013-10-18 14:57:43.000 1

(1 行受影响)

#4


引用 2 楼 yangsh0722 的回复:

SELECT uid,MAX(uscore) AS uscore,CONVERT(VARCHAR(10),utime,120) AS utime 
FROM tb WITH(NOLOCK)
GROUP BY uid,CONVERT(VARCHAR(10),utime,120)
ORDER BY MAX(uscore) DESC
120统计不了“一天”

#5



if object_id('[tb]') is not null drop table [huang]
go 
create table [tb]([uid] int,[uscore] int,[utime] datetime)
insert [tb]
select 1,8800,'2013-10-12 10:49:04' union all
select 3,11300,'2013-10-15 20:44:58' union all
select 5,7200,'2013-10-14 16:06:09' union all
select 6,16400,'2013-10-18 14:57:43' union all
select 6,16300,'2013-10-16 14:57:43' union all
select 5,7100,'2013-10-16 16:06:09' union all
select 3,11200,'2013-10-16 20:44:58' union all
select 6,16100,'2013-10-18 14:57:43' union all
select 1,8300,'2013-10-16 10:49:04'

SELECT CONVERT(VARCHAR(10),utime,120) AS utime,uid,MAX(uscore) AS uscore
FROM tb WITH(NOLOCK)
GROUP BY uid,CONVERT(VARCHAR(10),utime,120)
ORDER BY CONVERT(VARCHAR(10),utime,120) ASC ,MAX(uscore) DESC

--结果
utime      uid         uscore
---------- ----------- -----------
2013-10-12 1           8800
2013-10-14 5           7200
2013-10-15 3           11300
2013-10-16 6           16300
2013-10-16 3           11200
2013-10-16 1           8300
2013-10-16 5           7100
2013-10-18 6           16400

(8 行受影响)

DROP TABLE tb

#6


引用 2 楼 yangsh0722 的回复:

SELECT uid,MAX(uscore) AS uscore,CONVERT(VARCHAR(10),utime,120) AS utime 
FROM tb WITH(NOLOCK)
GROUP BY uid,CONVERT(VARCHAR(10),utime,120)
ORDER BY MAX(uscore) DESC
拉到最下面

#7


引用 4 楼 DBA_Huangzj 的回复:
Quote: 引用 2 楼 yangsh0722 的回复:


SELECT uid,MAX(uscore) AS uscore,CONVERT(VARCHAR(10),utime,120) AS utime 
FROM tb WITH(NOLOCK)
GROUP BY uid,CONVERT(VARCHAR(10),utime,120)
ORDER BY MAX(uscore) DESC
120统计不了“一天”

可以呢嘛。我一直都是用120

#8


那是因为你强制指定varchar(10)

引用 7 楼 yangsh0722 的回复:
Quote: 引用 4 楼 DBA_Huangzj 的回复:

Quote: 引用 2 楼 yangsh0722 的回复:


SELECT uid,MAX(uscore) AS uscore,CONVERT(VARCHAR(10),utime,120) AS utime 
FROM tb WITH(NOLOCK)
GROUP BY uid,CONVERT(VARCHAR(10),utime,120)
ORDER BY MAX(uscore) DESC
120统计不了“一天”

可以呢嘛。我一直都是用120

#9


引用 6 楼 DBA_Huangzj 的回复:
Quote: 引用 2 楼 yangsh0722 的回复:


SELECT uid,MAX(uscore) AS uscore,CONVERT(VARCHAR(10),utime,120) AS utime 
FROM tb WITH(NOLOCK)
GROUP BY uid,CONVERT(VARCHAR(10),utime,120)
ORDER BY MAX(uscore) DESC
拉到最下面


SELECT CONVERT(CHAR(10),GETDATE(),23)
SELECT CONVERT(CHAR(10),GETDATE(),120)
----------
2013-10-22

(1 行受影响)


----------
2013-10-22

(1 行受影响)

截取前10位是一样的 求助关于sql一段时间内重复记录的问题

#10


引用 8 楼 DBA_Huangzj 的回复:
那是因为你强制指定varchar(10)

Quote: 引用 7 楼 yangsh0722 的回复:

Quote: 引用 4 楼 DBA_Huangzj 的回复:

Quote: 引用 2 楼 yangsh0722 的回复:


SELECT uid,MAX(uscore) AS uscore,CONVERT(VARCHAR(10),utime,120) AS utime 
FROM tb WITH(NOLOCK)
GROUP BY uid,CONVERT(VARCHAR(10),utime,120)
ORDER BY MAX(uscore) DESC
120统计不了“一天”

可以呢嘛。我一直都是用120

那必须啊 求助关于sql一段时间内重复记录的问题,你还不是强制了

#11


每天的统计,

if object_id('Tempdb..#t') is not null drop table #t
 create table #t(
[uid] int   null,
[uscore] int null,
[utime] datetime null

Insert Into #t
select 1,8800,'2013-10-12 10:49:04' union all
select 3,11300,'2013-10-15 20:44:58' union all
select 3,11400,'2013-10-15 21:55:58' union all
select 5 ,7200,'2013-10-14 16:06:09' union all
select 6 ,16400,'2013-10-18 14:57:43' union all
select 6 ,16100,'2013-10-18 14:51:43' union all
select 6 ,16300,'2013-10-16 14:57:43' union all
select 5 ,7100,'2013-10-16 16:06:09' union all
select 3 ,11200,'2013-10-16 20:44:58' union all
select 6 ,16100,'2013-10-18 14:57:43' union all
select 1 ,8300,'2013-10-16 10:49:04'
 
;with cte as(
select * ,row_number() over(partition by [uid],convert(varchar(10),utime,120) order by [uscore] desc) rownumberid from #t  
 
)
select * from cte where rownumberid=1
-------------

(11 行受影响)
uid         uscore      utime                   rownumberid
----------- ----------- ----------------------- --------------------
1           8800        2013-10-12 10:49:04.000 1
1           8300        2013-10-16 10:49:04.000 1
3           11400       2013-10-15 21:55:58.000 1
3           11200       2013-10-16 20:44:58.000 1
5           7200        2013-10-14 16:06:09.000 1
5           7100        2013-10-16 16:06:09.000 1
6           16300       2013-10-16 14:57:43.000 1
6           16400       2013-10-18 14:57:43.000 1

(8 行受影响)


#12


引用 6 楼 DBA_Huangzj 的回复:
Quote: 引用 2 楼 yangsh0722 的回复:


SELECT uid,MAX(uscore) AS uscore,CONVERT(VARCHAR(10),utime,120) AS utime 
FROM tb WITH(NOLOCK)
GROUP BY uid,CONVERT(VARCHAR(10),utime,120)
ORDER BY MAX(uscore) DESC
拉到最下面

哥,下班不多呆一分钟,走人,晚饭多吃点

#13


引用 9 楼 yangsh0722 的回复:
Quote: 引用 6 楼 DBA_Huangzj 的回复:

Quote: 引用 2 楼 yangsh0722 的回复:


SELECT uid,MAX(uscore) AS uscore,CONVERT(VARCHAR(10),utime,120) AS utime 
FROM tb WITH(NOLOCK)
GROUP BY uid,CONVERT(VARCHAR(10),utime,120)
ORDER BY MAX(uscore) DESC
拉到最下面


SELECT CONVERT(CHAR(10),GETDATE(),23)
SELECT CONVERT(CHAR(10),GETDATE(),120)
----------
2013-10-22

(1 行受影响)


----------
2013-10-22

(1 行受影响)

截取前10位是一样的 求助关于sql一段时间内重复记录的问题
强行截取我不保证不丢失

#14




if object_id('tb') is not null 
   drop table tb
go

create table tb
(
uid int   null,
uscore int null,
utime datetime null


Insert Into tb
select 1,8800,'2013-10-12 10:49:04' union all
select 3,11300,'2013-10-15 20:44:58' union all
select 5 ,7200,'2013-10-14 16:06:09' union all
select 6 ,16400,'2013-10-18 14:57:43' union all
select 6 ,16300,'2013-10-16 14:57:43' union all
select 5 ,7100,'2013-10-16 16:06:09' union all
select 3 ,11200,'2013-10-16 20:44:58' union all
select 6 ,16100,'2013-10-18 14:57:43' union all
select 1 ,8300,'2013-10-16 10:49:04'
 
;with t 
as
(
select uid,
       uscore,
       utime,
       row_number() over(partition by uid 
                             order by uscore desc) as rownum
from tb  
--如果只需要某个时间段的,那么加上where就可以
--where (Utime BETWEEN  '2013/10/18' and '2013/10/19')
)

select uid,
       uscore,
       utime,
       dense_rank() over(order by uscore desc) as '排名'
from t
where rownum = 1
/*
uid         uscore      utime                   排名
----------- ----------- ----------------------- --------------------
6           16400       2013-10-18 14:57:43.000 1
3           11300       2013-10-15 20:44:58.000 2
1           8800        2013-10-12 10:49:04.000 3
5           7200        2013-10-14 16:06:09.000 4
*/

#15


这个是,在某一天的排名情况,需要过滤时间:


if object_id('tb') is not null 
   drop table tb
go

create table tb
(
uid int   null,
uscore int null,
utime datetime null


Insert Into tb
select 1,8800,'2013-10-12 10:49:04' union all
select 3,11300,'2013-10-15 20:44:58' union all
select 5 ,7200,'2013-10-14 16:06:09' union all
select 6 ,16400,'2013-10-18 14:57:43' union all
select 6 ,16300,'2013-10-16 14:57:43' union all
select 5 ,7100,'2013-10-16 16:06:09' union all
select 3 ,11200,'2013-10-16 20:44:58' union all
select 6 ,16100,'2013-10-18 14:57:43' union all
select 1 ,8300,'2013-10-16 10:49:04'
 
;with t 
as
(
select uid,
       uscore,
       utime,
       row_number() over(partition by uid 
                             order by uscore desc) as rownum
from tb  
where utime >= '2013-10-16' and
      utime < '2013-10-17'
)

select uid,
       uscore,
       utime,
       dense_rank() over(order by uscore desc) as '排名'
from t
where rownum = 1
/*
uid         uscore      utime                   排名
----------- ----------- ----------------------- --------------------
6           16300       2013-10-16 14:57:43.000 1
3           11200       2013-10-16 20:44:58.000 2
1           8300        2013-10-16 10:49:04.000 3
5           7100        2013-10-16 16:06:09.000 4
*/

#16


引用 1 楼 DBA_Huangzj 的回复:
日期筛选你自己加where条件即可
----------------------------------------------------------------
-- Author  :DBA_Huangzj(發糞塗牆)
-- Date    :2013-10-22 17:10:34
-- Version:
--      Microsoft SQL Server 2012 (SP1) - 11.0.3128.0 (X64) 
-- Dec 28 2012 20:23:12 
-- Copyright (c) Microsoft Corporation
-- Enterprise Edition (64-bit) on Windows NT 6.2 <X64> (Build 9200: ) (Hypervisor)
--
----------------------------------------------------------------
--> 测试数据:[huang]
if object_id('[huang]') is not null drop table [huang]
go 
create table [huang]([uid] int,[uscore] int,[utime] datetime)
insert [huang]
select 1,8800,'2013-10-12 10:49:04' union all
select 3,11300,'2013-10-15 20:44:58' union all
select 5,7200,'2013-10-14 16:06:09' union all
select 6,16400,'2013-10-18 14:57:43' union all
select 6,16300,'2013-10-16 14:57:43' union all
select 5,7100,'2013-10-16 16:06:09' union all
select 3,11200,'2013-10-16 20:44:58' union all
select 6,16100,'2013-10-18 14:57:43' union all
select 1,8300,'2013-10-16 10:49:04'
--------------开始查询--------------------------

select *
 from [huang] a
 WHERE EXISTS (SELECT 1 FROM (SELECT [uid],MAX([uscore])[uscore],CONVERT(CHAR(10),[utime],23) [utime] FROM huang GROUP BY  [uid],CONVERT(CHAR(10),[utime],23))b
 WHERE CONVERT(CHAR(10),a.[utime],23)=b.utime AND a.[uid]=b.[uid] AND a.uscore=b.uscore)
----------------结果----------------------------
/* 
uid         uscore      utime
----------- ----------- -----------------------
1           8800        2013-10-12 10:49:04.000
3           11300       2013-10-15 20:44:58.000
5           7200        2013-10-14 16:06:09.000
6           16400       2013-10-18 14:57:43.000
6           16300       2013-10-16 14:57:43.000
5           7100        2013-10-16 16:06:09.000
3           11200       2013-10-16 20:44:58.000
1           8300        2013-10-16 10:49:04.000
*/


朋友 你好 我可能没有说清楚,
sql查询语句是用到asp程序里面来查询的,时间是范围是年月日小时分秒 这样的,
总排行是 每个用户 只显示一条数据 得分只显示 该用户得分最高的一次记录,
如果指定时间范围,就显示在该范围内 该用户得分最高的一次记录。

#17


引用 15 楼 yupeigu 的回复:
这个是,在某一天的排名情况,需要过滤时间:


if object_id('tb') is not null 
   drop table tb
go

create table tb
(
uid int   null,
uscore int null,
utime datetime null


Insert Into tb
select 1,8800,'2013-10-12 10:49:04' union all
select 3,11300,'2013-10-15 20:44:58' union all
select 5 ,7200,'2013-10-14 16:06:09' union all
select 6 ,16400,'2013-10-18 14:57:43' union all
select 6 ,16300,'2013-10-16 14:57:43' union all
select 5 ,7100,'2013-10-16 16:06:09' union all
select 3 ,11200,'2013-10-16 20:44:58' union all
select 6 ,16100,'2013-10-18 14:57:43' union all
select 1 ,8300,'2013-10-16 10:49:04'
 
;with t 
as
(
select uid,
       uscore,
       utime,
       row_number() over(partition by uid 
                             order by uscore desc) as rownum
from tb  
where utime >= '2013-10-16' and
      utime < '2013-10-17'
)

select uid,
       uscore,
       utime,
       dense_rank() over(order by uscore desc) as '排名'
from t
where rownum = 1
/*
uid         uscore      utime                   排名
----------- ----------- ----------------------- --------------------
6           16300       2013-10-16 14:57:43.000 1
3           11200       2013-10-16 20:44:58.000 2
1           8300        2013-10-16 10:49:04.000 3
5           7100        2013-10-16 16:06:09.000 4
*/


朋友你好 你这个效果就是我想要的,但是这个如何放在asp的查询语句里呢,好像和常写的查询代码不太一样

#18


引用 2 楼 yangsh0722 的回复:

SELECT uid,MAX(uscore) AS uscore,CONVERT(VARCHAR(10),utime,120) AS utime 
FROM tb WITH(NOLOCK)
GROUP BY uid,CONVERT(VARCHAR(10),utime,120)
ORDER BY MAX(uscore) DESC


你好 代码我测试了,发现用户记录有重复的,我只想在某个时间范围内每个用户只显示最高得分的记录,
查询语句是放在asp查询里 

谢谢

#19


----------------------------------------------------------------
-- Author  :DBA_Huangzj(發糞塗牆)
-- Date    :2013-10-22 17:10:34
-- Version:
--      Microsoft SQL Server 2012 (SP1) - 11.0.3128.0 (X64) 
--    Dec 28 2012 20:23:12 
--    Copyright (c) Microsoft Corporation
--    Enterprise Edition (64-bit) on Windows NT 6.2 <X64> (Build 9200: ) (Hypervisor)
--
----------------------------------------------------------------
--> 测试数据:[huang]
if object_id('[huang]') is not null drop table [huang]
go 
create table [huang]([uid] int,[uscore] int,[utime] datetime)
insert [huang]
select 1,8800,'2013-10-12 10:49:04' union all
select 3,11300,'2013-10-15 20:44:58' union all
select 5,7200,'2013-10-14 16:06:09' union all
select 6,16400,'2013-10-18 14:57:43' union all
select 6,16300,'2013-10-16 14:57:43' union all
select 5,7100,'2013-10-16 16:06:09' union all
select 3,11200,'2013-10-16 20:44:58' union all
select 6,16100,'2013-10-18 14:57:43' union all
select 1,8300,'2013-10-16 10:49:04'
--------------开始查询--------------------------
 
select *
 from [huang] a
 WHERE EXISTS (SELECT 1 FROM (SELECT [uid],MAX([uscore])[uscore] FROM huang --如果需要筛选日期,加where条件在这里
  GROUP BY  [uid])b
 WHERE  a.[uid]=b.[uid] AND a.uscore=b.uscore)

 /*
 uid         uscore      utime
----------- ----------- -----------------------
1           8800        2013-10-12 10:49:04.000
3           11300       2013-10-15 20:44:58.000
5           7200        2013-10-14 16:06:09.000
6           16400       2013-10-18 14:57:43.000
 */

#20


引用 17 楼 lanzengquan 的回复:
Quote: 引用 15 楼 yupeigu 的回复:

这个是,在某一天的排名情况,需要过滤时间:


if object_id('tb') is not null 
   drop table tb
go

create table tb
(
uid int   null,
uscore int null,
utime datetime null


Insert Into tb
select 1,8800,'2013-10-12 10:49:04' union all
select 3,11300,'2013-10-15 20:44:58' union all
select 5 ,7200,'2013-10-14 16:06:09' union all
select 6 ,16400,'2013-10-18 14:57:43' union all
select 6 ,16300,'2013-10-16 14:57:43' union all
select 5 ,7100,'2013-10-16 16:06:09' union all
select 3 ,11200,'2013-10-16 20:44:58' union all
select 6 ,16100,'2013-10-18 14:57:43' union all
select 1 ,8300,'2013-10-16 10:49:04'
 
;with t 
as
(
select uid,
       uscore,
       utime,
       row_number() over(partition by uid 
                             order by uscore desc) as rownum
from tb  
where utime >= '2013-10-16' and
      utime < '2013-10-17'
)

select uid,
       uscore,
       utime,
       dense_rank() over(order by uscore desc) as '排名'
from t
where rownum = 1
/*
uid         uscore      utime                   排名
----------- ----------- ----------------------- --------------------
6           16300       2013-10-16 14:57:43.000 1
3           11200       2013-10-16 20:44:58.000 2
1           8300        2013-10-16 10:49:04.000 3
5           7100        2013-10-16 16:06:09.000 4
*/


朋友你好 你这个效果就是我想要的,但是这个如何放在asp的查询语句里呢,好像和常写的查询代码不太一样


哦,你的数据库时2005及以后的吗?

#21


引用 20 楼 yupeigu 的回复:
Quote: 引用 17 楼 lanzengquan 的回复:

Quote: 引用 15 楼 yupeigu 的回复:

这个是,在某一天的排名情况,需要过滤时间:


if object_id('tb') is not null 
   drop table tb
go

create table tb
(
uid int   null,
uscore int null,
utime datetime null


Insert Into tb
select 1,8800,'2013-10-12 10:49:04' union all
select 3,11300,'2013-10-15 20:44:58' union all
select 5 ,7200,'2013-10-14 16:06:09' union all
select 6 ,16400,'2013-10-18 14:57:43' union all
select 6 ,16300,'2013-10-16 14:57:43' union all
select 5 ,7100,'2013-10-16 16:06:09' union all
select 3 ,11200,'2013-10-16 20:44:58' union all
select 6 ,16100,'2013-10-18 14:57:43' union all
select 1 ,8300,'2013-10-16 10:49:04'
 
;with t 
as
(
select uid,
       uscore,
       utime,
       row_number() over(partition by uid 
                             order by uscore desc) as rownum
from tb  
where utime >= '2013-10-16' and
      utime < '2013-10-17'
)

select uid,
       uscore,
       utime,
       dense_rank() over(order by uscore desc) as '排名'
from t
where rownum = 1
/*
uid         uscore      utime                   排名
----------- ----------- ----------------------- --------------------
6           16300       2013-10-16 14:57:43.000 1
3           11200       2013-10-16 20:44:58.000 2
1           8300        2013-10-16 10:49:04.000 3
5           7100        2013-10-16 16:06:09.000 4
*/


朋友你好 你这个效果就是我想要的,但是这个如何放在asp的查询语句里呢,好像和常写的查询代码不太一样


哦,你的数据库时2005及以后的吗?


是sql2005的

#22


引用 19 楼 DBA_Huangzj 的回复:
----------------------------------------------------------------
-- Author  :DBA_Huangzj(發糞塗牆)
-- Date    :2013-10-22 17:10:34
-- Version:
--      Microsoft SQL Server 2012 (SP1) - 11.0.3128.0 (X64) 
--    Dec 28 2012 20:23:12 
--    Copyright (c) Microsoft Corporation
--    Enterprise Edition (64-bit) on Windows NT 6.2 <X64> (Build 9200: ) (Hypervisor)
--
----------------------------------------------------------------
--> 测试数据:[huang]
if object_id('[huang]') is not null drop table [huang]
go 
create table [huang]([uid] int,[uscore] int,[utime] datetime)
insert [huang]
select 1,8800,'2013-10-12 10:49:04' union all
select 3,11300,'2013-10-15 20:44:58' union all
select 5,7200,'2013-10-14 16:06:09' union all
select 6,16400,'2013-10-18 14:57:43' union all
select 6,16300,'2013-10-16 14:57:43' union all
select 5,7100,'2013-10-16 16:06:09' union all
select 3,11200,'2013-10-16 20:44:58' union all
select 6,16100,'2013-10-18 14:57:43' union all
select 1,8300,'2013-10-16 10:49:04'
--------------开始查询--------------------------
 
select *
 from [huang] a
 WHERE EXISTS (SELECT 1 FROM (SELECT [uid],MAX([uscore])[uscore] FROM huang --如果需要筛选日期,加where条件在这里
  GROUP BY  [uid])b
 WHERE  a.[uid]=b.[uid] AND a.uscore=b.uscore)

 /*
 uid         uscore      utime
----------- ----------- -----------------------
1           8800        2013-10-12 10:49:04.000
3           11300       2013-10-15 20:44:58.000
5           7200        2013-10-14 16:06:09.000
6           16400       2013-10-18 14:57:43.000
 */


在你标注的地方 加了where  utime>'2013-10-12' 生成的结果 又出现重复的用户数据

#23


引用 21 楼 lanzengquan 的回复:
Quote: 引用 20 楼 yupeigu 的回复:

Quote: 引用 17 楼 lanzengquan 的回复:

Quote: 引用 15 楼 yupeigu 的回复:

这个是,在某一天的排名情况,需要过滤时间:


if object_id('tb') is not null 
   drop table tb
go

create table tb
(
uid int   null,
uscore int null,
utime datetime null


Insert Into tb
select 1,8800,'2013-10-12 10:49:04' union all
select 3,11300,'2013-10-15 20:44:58' union all
select 5 ,7200,'2013-10-14 16:06:09' union all
select 6 ,16400,'2013-10-18 14:57:43' union all
select 6 ,16300,'2013-10-16 14:57:43' union all
select 5 ,7100,'2013-10-16 16:06:09' union all
select 3 ,11200,'2013-10-16 20:44:58' union all
select 6 ,16100,'2013-10-18 14:57:43' union all
select 1 ,8300,'2013-10-16 10:49:04'
 
;with t 
as
(
select uid,
       uscore,
       utime,
       row_number() over(partition by uid 
                             order by uscore desc) as rownum
from tb  
where utime >= '2013-10-16' and
      utime < '2013-10-17'
)

select uid,
       uscore,
       utime,
       dense_rank() over(order by uscore desc) as '排名'
from t
where rownum = 1
/*
uid         uscore      utime                   排名
----------- ----------- ----------------------- --------------------
6           16300       2013-10-16 14:57:43.000 1
3           11200       2013-10-16 20:44:58.000 2
1           8300        2013-10-16 10:49:04.000 3
5           7100        2013-10-16 16:06:09.000 4
*/


朋友你好 你这个效果就是我想要的,但是这个如何放在asp的查询语句里呢,好像和常写的查询代码不太一样


哦,你的数据库时2005及以后的吗?


是sql2005的


哦,那就完全没问题了,上面的写法就是适合2005版本的写法,比较简洁,用的是with表达式写的,看上去确实和平时写的不太一样,直接把这个语句放进去就可以,和普通的语句是一样的,注意with左边的分号是必须的:

;with t 
as
(
select uid,
       uscore,
       utime,
       row_number() over(partition by uid 
                             order by uscore desc) as rownum
from tb  
where utime >= '2013-10-16' and
      utime < '2013-10-17'
)
 
select uid,
       uscore,
       utime,
       dense_rank() over(order by uscore desc) as '排名'
from t  where rownum = 1

#24


引用 23 楼 yupeigu 的回复:
Quote: 引用 21 楼 lanzengquan 的回复:

Quote: 引用 20 楼 yupeigu 的回复:

Quote: 引用 17 楼 lanzengquan 的回复:

Quote: 引用 15 楼 yupeigu 的回复:

这个是,在某一天的排名情况,需要过滤时间:


if object_id('tb') is not null 
   drop table tb
go

create table tb
(
uid int   null,
uscore int null,
utime datetime null


Insert Into tb
select 1,8800,'2013-10-12 10:49:04' union all
select 3,11300,'2013-10-15 20:44:58' union all
select 5 ,7200,'2013-10-14 16:06:09' union all
select 6 ,16400,'2013-10-18 14:57:43' union all
select 6 ,16300,'2013-10-16 14:57:43' union all
select 5 ,7100,'2013-10-16 16:06:09' union all
select 3 ,11200,'2013-10-16 20:44:58' union all
select 6 ,16100,'2013-10-18 14:57:43' union all
select 1 ,8300,'2013-10-16 10:49:04'
 
;with t 
as
(
select uid,
       uscore,
       utime,
       row_number() over(partition by uid 
                             order by uscore desc) as rownum
from tb  
where utime >= '2013-10-16' and
      utime < '2013-10-17'
)

select uid,
       uscore,
       utime,
       dense_rank() over(order by uscore desc) as '排名'
from t
where rownum = 1
/*
uid         uscore      utime                   排名
----------- ----------- ----------------------- --------------------
6           16300       2013-10-16 14:57:43.000 1
3           11200       2013-10-16 20:44:58.000 2
1           8300        2013-10-16 10:49:04.000 3
5           7100        2013-10-16 16:06:09.000 4
*/


朋友你好 你这个效果就是我想要的,但是这个如何放在asp的查询语句里呢,好像和常写的查询代码不太一样


哦,你的数据库时2005及以后的吗?


是sql2005的


哦,那就完全没问题了,上面的写法就是适合2005版本的写法,比较简洁,用的是with表达式写的,看上去确实和平时写的不太一样,直接把这个语句放进去就可以,和普通的语句是一样的,注意with左边的分号是必须的:

;with t 
as
(
select uid,
       uscore,
       utime,
       row_number() over(partition by uid 
                             order by uscore desc) as rownum
from tb  
where utime >= '2013-10-16' and
      utime < '2013-10-17'
)
 
select uid,
       uscore,
       utime,
       dense_rank() over(order by uscore desc) as '排名'
from t  where rownum = 1


好像放在asp的查询里没法运行,一运行iis就死了

#25


引用 22 楼 lanzengquan 的回复:
Quote: 引用 19 楼 DBA_Huangzj 的回复:

----------------------------------------------------------------
-- Author  :DBA_Huangzj(發糞塗牆)
-- Date    :2013-10-22 17:10:34
-- Version:
--      Microsoft SQL Server 2012 (SP1) - 11.0.3128.0 (X64) 
--    Dec 28 2012 20:23:12 
--    Copyright (c) Microsoft Corporation
--    Enterprise Edition (64-bit) on Windows NT 6.2 <X64> (Build 9200: ) (Hypervisor)
--
----------------------------------------------------------------
--> 测试数据:[huang]
if object_id('[huang]') is not null drop table [huang]
go 
create table [huang]([uid] int,[uscore] int,[utime] datetime)
insert [huang]
select 1,8800,'2013-10-12 10:49:04' union all
select 3,11300,'2013-10-15 20:44:58' union all
select 5,7200,'2013-10-14 16:06:09' union all
select 6,16400,'2013-10-18 14:57:43' union all
select 6,16300,'2013-10-16 14:57:43' union all
select 5,7100,'2013-10-16 16:06:09' union all
select 3,11200,'2013-10-16 20:44:58' union all
select 6,16100,'2013-10-18 14:57:43' union all
select 1,8300,'2013-10-16 10:49:04'
--------------开始查询--------------------------
 
select *
 from [huang] a
 WHERE EXISTS (SELECT 1 FROM (SELECT [uid],MAX([uscore])[uscore] FROM huang --如果需要筛选日期,加where条件在这里
  GROUP BY  [uid])b
 WHERE  a.[uid]=b.[uid] AND a.uscore=b.uscore)

 /*
 uid         uscore      utime
----------- ----------- -----------------------
1           8800        2013-10-12 10:49:04.000
3           11300       2013-10-15 20:44:58.000
5           7200        2013-10-14 16:06:09.000
6           16400       2013-10-18 14:57:43.000
 */


在你标注的地方 加了where  utime>'2013-10-12' 生成的结果 又出现重复的用户数据


出现重复的用户数据 是因为该用户在一段时间内得分相同,就都统计出来了,
还有个问题 我加了时间范围,该用户在相同得分的几条记录里,9月份的数据也会显示出来

#26


引用 24 楼 lanzengquan 的回复:
Quote: 引用 23 楼 yupeigu 的回复:

Quote: 引用 21 楼 lanzengquan 的回复:

Quote: 引用 20 楼 yupeigu 的回复:

Quote: 引用 17 楼 lanzengquan 的回复:

Quote: 引用 15 楼 yupeigu 的回复:

这个是,在某一天的排名情况,需要过滤时间:


if object_id('tb') is not null 
   drop table tb
go

create table tb
(
uid int   null,
uscore int null,
utime datetime null


Insert Into tb
select 1,8800,'2013-10-12 10:49:04' union all
select 3,11300,'2013-10-15 20:44:58' union all
select 5 ,7200,'2013-10-14 16:06:09' union all
select 6 ,16400,'2013-10-18 14:57:43' union all
select 6 ,16300,'2013-10-16 14:57:43' union all
select 5 ,7100,'2013-10-16 16:06:09' union all
select 3 ,11200,'2013-10-16 20:44:58' union all
select 6 ,16100,'2013-10-18 14:57:43' union all
select 1 ,8300,'2013-10-16 10:49:04'
 
;with t 
as
(
select uid,
       uscore,
       utime,
       row_number() over(partition by uid 
                             order by uscore desc) as rownum
from tb  
where utime >= '2013-10-16' and
      utime < '2013-10-17'
)

select uid,
       uscore,
       utime,
       dense_rank() over(order by uscore desc) as '排名'
from t
where rownum = 1
/*
uid         uscore      utime                   排名
----------- ----------- ----------------------- --------------------
6           16300       2013-10-16 14:57:43.000 1
3           11200       2013-10-16 20:44:58.000 2
1           8300        2013-10-16 10:49:04.000 3
5           7100        2013-10-16 16:06:09.000 4
*/


朋友你好 你这个效果就是我想要的,但是这个如何放在asp的查询语句里呢,好像和常写的查询代码不太一样


哦,你的数据库时2005及以后的吗?


是sql2005的


哦,那就完全没问题了,上面的写法就是适合2005版本的写法,比较简洁,用的是with表达式写的,看上去确实和平时写的不太一样,直接把这个语句放进去就可以,和普通的语句是一样的,注意with左边的分号是必须的:

;with t 
as
(
select uid,
       uscore,
       utime,
       row_number() over(partition by uid 
                             order by uscore desc) as rownum
from tb  
where utime >= '2013-10-16' and
      utime < '2013-10-17'
)
 
select uid,
       uscore,
       utime,
       dense_rank() over(order by uscore desc) as '排名'
from t  where rownum = 1


好像放在asp的查询里没法运行,一运行iis就死了


我把语句改写了一下,试试:
select [uid],uscore,utime,dense_rank() over(order by uscore desc) as r
from
(
select [uid],uscore,utime,row_number() over(partition by uid order by uscore desc) as rownum
from tb where utime >= '2013-10-16' and utime < '2013-10-17'
)t where rownum = 1  

#27


改了一下:
select uid,uscore,utime,dense_rank() over(order by uscore desc) as r
from
(
select uid,uscore,utime,row_number() over(partition by uid order by uscore desc) as rownum
from tb where utime >= '2013-10-16' and utime < '2013-10-17'
)t where rownum = 1

#28


引用 27 楼 yupeigu 的回复:
改了一下:
select uid,uscore,utime,dense_rank() over(order by uscore desc) as r
from
(
select uid,uscore,utime,row_number() over(partition by uid order by uscore desc) as rownum
from tb where utime >= '2013-10-16' and utime < '2013-10-17'
)t where rownum = 1


这个可以用 兄弟 你真牛啊 
最后一个问题 现在可以筛选出某一时段的用户排行 
但是分数相同的 显示排名也相同 
如果改为按照123。。。。 99 100这样的排名 要修改哪里

#29


引用 28 楼 lanzengquan 的回复:
Quote: 引用 27 楼 yupeigu 的回复:

改了一下:
select uid,uscore,utime,dense_rank() over(order by uscore desc) as r
from
(
select uid,uscore,utime,row_number() over(partition by uid order by uscore desc) as rownum
from tb where utime >= '2013-10-16' and utime < '2013-10-17'
)t where rownum = 1


这个可以用 兄弟 你真牛啊 
最后一个问题 现在可以筛选出某一时段的用户排行 
但是分数相同的 显示排名也相同 
如果改为按照123。。。。 99 100这样的排名 要修改哪里


你的意思是,分数一样的,排名要不同是把,比如就是1,2,3,而不是1,1,2,3是吧,
我改了一下了,分数一样,也会往下排,你试试:

select uid,uscore,utime,row_number() over(order by uscore desc) as r
from
(
select uid,uscore,utime,row_number() over(partition by uid order by uscore desc) as rownum
from tb where utime >= '2013-10-16' and utime < '2013-10-17'
)t where rownum = 1


#30


引用 29 楼 yupeigu 的回复:
Quote: 引用 28 楼 lanzengquan 的回复:

Quote: 引用 27 楼 yupeigu 的回复:

改了一下:
select uid,uscore,utime,dense_rank() over(order by uscore desc) as r
from
(
select uid,uscore,utime,row_number() over(partition by uid order by uscore desc) as rownum
from tb where utime >= '2013-10-16' and utime < '2013-10-17'
)t where rownum = 1


这个可以用 兄弟 你真牛啊 
最后一个问题 现在可以筛选出某一时段的用户排行 
但是分数相同的 显示排名也相同 
如果改为按照123。。。。 99 100这样的排名 要修改哪里


你的意思是,分数一样的,排名要不同是把,比如就是1,2,3,而不是1,1,2,3是吧,
我改了一下了,分数一样,也会往下排,你试试:

select uid,uscore,utime,row_number() over(order by uscore desc) as r
from
(
select uid,uscore,utime,row_number() over(partition by uid order by uscore desc) as rownum
from tb where utime >= '2013-10-16' and utime < '2013-10-17'
)t where rownum = 1





通过测试,太给力了,非常谢谢,兄弟

#1


日期筛选你自己加where条件即可
----------------------------------------------------------------
-- Author  :DBA_Huangzj(發糞塗牆)
-- Date    :2013-10-22 17:10:34
-- Version:
--      Microsoft SQL Server 2012 (SP1) - 11.0.3128.0 (X64) 
-- Dec 28 2012 20:23:12 
-- Copyright (c) Microsoft Corporation
-- Enterprise Edition (64-bit) on Windows NT 6.2 <X64> (Build 9200: ) (Hypervisor)
--
----------------------------------------------------------------
--> 测试数据:[huang]
if object_id('[huang]') is not null drop table [huang]
go 
create table [huang]([uid] int,[uscore] int,[utime] datetime)
insert [huang]
select 1,8800,'2013-10-12 10:49:04' union all
select 3,11300,'2013-10-15 20:44:58' union all
select 5,7200,'2013-10-14 16:06:09' union all
select 6,16400,'2013-10-18 14:57:43' union all
select 6,16300,'2013-10-16 14:57:43' union all
select 5,7100,'2013-10-16 16:06:09' union all
select 3,11200,'2013-10-16 20:44:58' union all
select 6,16100,'2013-10-18 14:57:43' union all
select 1,8300,'2013-10-16 10:49:04'
--------------开始查询--------------------------

select *
 from [huang] a
 WHERE EXISTS (SELECT 1 FROM (SELECT [uid],MAX([uscore])[uscore],CONVERT(CHAR(10),[utime],23) [utime] FROM huang GROUP BY  [uid],CONVERT(CHAR(10),[utime],23))b
 WHERE CONVERT(CHAR(10),a.[utime],23)=b.utime AND a.[uid]=b.[uid] AND a.uscore=b.uscore)
----------------结果----------------------------
/* 
uid         uscore      utime
----------- ----------- -----------------------
1           8800        2013-10-12 10:49:04.000
3           11300       2013-10-15 20:44:58.000
5           7200        2013-10-14 16:06:09.000
6           16400       2013-10-18 14:57:43.000
6           16300       2013-10-16 14:57:43.000
5           7100        2013-10-16 16:06:09.000
3           11200       2013-10-16 20:44:58.000
1           8300        2013-10-16 10:49:04.000
*/

#2



SELECT uid,MAX(uscore) AS uscore,CONVERT(VARCHAR(10),utime,120) AS utime 
FROM tb WITH(NOLOCK)
GROUP BY uid,CONVERT(VARCHAR(10),utime,120)
ORDER BY MAX(uscore) DESC

#3




if object_id('Tempdb..#t') is not null drop table #t
 create table #t(
[uid] int   null,
[uscore] int null,
[utime] datetime null

Insert Into #t
select 1,8800,'2013-10-12 10:49:04' union all
select 3,11300,'2013-10-15 20:44:58' union all
select 5 ,7200,'2013-10-14 16:06:09' union all
select 6 ,16400,'2013-10-18 14:57:43' union all
select 6 ,16300,'2013-10-16 14:57:43' union all
select 5 ,7100,'2013-10-16 16:06:09' union all
select 3 ,11200,'2013-10-16 20:44:58' union all
select 6 ,16100,'2013-10-18 14:57:43' union all
select 1 ,8300,'2013-10-16 10:49:04'
 
;with cte as(
select * ,row_number() over(partition by [uid] order by [uscore] desc) rownumberid from #t  
where (Utime BETWEEN  '2013/10/18' and '2013/10/19')
)
select * from cte where rownumberid=1
----------------
(9 行受影响)
uid         uscore      utime                   rownumberid
----------- ----------- ----------------------- --------------------
6           16400       2013-10-18 14:57:43.000 1

(1 行受影响)

#4


引用 2 楼 yangsh0722 的回复:

SELECT uid,MAX(uscore) AS uscore,CONVERT(VARCHAR(10),utime,120) AS utime 
FROM tb WITH(NOLOCK)
GROUP BY uid,CONVERT(VARCHAR(10),utime,120)
ORDER BY MAX(uscore) DESC
120统计不了“一天”

#5



if object_id('[tb]') is not null drop table [huang]
go 
create table [tb]([uid] int,[uscore] int,[utime] datetime)
insert [tb]
select 1,8800,'2013-10-12 10:49:04' union all
select 3,11300,'2013-10-15 20:44:58' union all
select 5,7200,'2013-10-14 16:06:09' union all
select 6,16400,'2013-10-18 14:57:43' union all
select 6,16300,'2013-10-16 14:57:43' union all
select 5,7100,'2013-10-16 16:06:09' union all
select 3,11200,'2013-10-16 20:44:58' union all
select 6,16100,'2013-10-18 14:57:43' union all
select 1,8300,'2013-10-16 10:49:04'

SELECT CONVERT(VARCHAR(10),utime,120) AS utime,uid,MAX(uscore) AS uscore
FROM tb WITH(NOLOCK)
GROUP BY uid,CONVERT(VARCHAR(10),utime,120)
ORDER BY CONVERT(VARCHAR(10),utime,120) ASC ,MAX(uscore) DESC

--结果
utime      uid         uscore
---------- ----------- -----------
2013-10-12 1           8800
2013-10-14 5           7200
2013-10-15 3           11300
2013-10-16 6           16300
2013-10-16 3           11200
2013-10-16 1           8300
2013-10-16 5           7100
2013-10-18 6           16400

(8 行受影响)

DROP TABLE tb

#6


引用 2 楼 yangsh0722 的回复:

SELECT uid,MAX(uscore) AS uscore,CONVERT(VARCHAR(10),utime,120) AS utime 
FROM tb WITH(NOLOCK)
GROUP BY uid,CONVERT(VARCHAR(10),utime,120)
ORDER BY MAX(uscore) DESC
拉到最下面

#7


引用 4 楼 DBA_Huangzj 的回复:
Quote: 引用 2 楼 yangsh0722 的回复:


SELECT uid,MAX(uscore) AS uscore,CONVERT(VARCHAR(10),utime,120) AS utime 
FROM tb WITH(NOLOCK)
GROUP BY uid,CONVERT(VARCHAR(10),utime,120)
ORDER BY MAX(uscore) DESC
120统计不了“一天”

可以呢嘛。我一直都是用120

#8


那是因为你强制指定varchar(10)

引用 7 楼 yangsh0722 的回复:
Quote: 引用 4 楼 DBA_Huangzj 的回复:

Quote: 引用 2 楼 yangsh0722 的回复:


SELECT uid,MAX(uscore) AS uscore,CONVERT(VARCHAR(10),utime,120) AS utime 
FROM tb WITH(NOLOCK)
GROUP BY uid,CONVERT(VARCHAR(10),utime,120)
ORDER BY MAX(uscore) DESC
120统计不了“一天”

可以呢嘛。我一直都是用120

#9


引用 6 楼 DBA_Huangzj 的回复:
Quote: 引用 2 楼 yangsh0722 的回复:


SELECT uid,MAX(uscore) AS uscore,CONVERT(VARCHAR(10),utime,120) AS utime 
FROM tb WITH(NOLOCK)
GROUP BY uid,CONVERT(VARCHAR(10),utime,120)
ORDER BY MAX(uscore) DESC
拉到最下面


SELECT CONVERT(CHAR(10),GETDATE(),23)
SELECT CONVERT(CHAR(10),GETDATE(),120)
----------
2013-10-22

(1 行受影响)


----------
2013-10-22

(1 行受影响)

截取前10位是一样的 求助关于sql一段时间内重复记录的问题

#10


引用 8 楼 DBA_Huangzj 的回复:
那是因为你强制指定varchar(10)

Quote: 引用 7 楼 yangsh0722 的回复:

Quote: 引用 4 楼 DBA_Huangzj 的回复:

Quote: 引用 2 楼 yangsh0722 的回复:


SELECT uid,MAX(uscore) AS uscore,CONVERT(VARCHAR(10),utime,120) AS utime 
FROM tb WITH(NOLOCK)
GROUP BY uid,CONVERT(VARCHAR(10),utime,120)
ORDER BY MAX(uscore) DESC
120统计不了“一天”

可以呢嘛。我一直都是用120

那必须啊 求助关于sql一段时间内重复记录的问题,你还不是强制了

#11


每天的统计,

if object_id('Tempdb..#t') is not null drop table #t
 create table #t(
[uid] int   null,
[uscore] int null,
[utime] datetime null

Insert Into #t
select 1,8800,'2013-10-12 10:49:04' union all
select 3,11300,'2013-10-15 20:44:58' union all
select 3,11400,'2013-10-15 21:55:58' union all
select 5 ,7200,'2013-10-14 16:06:09' union all
select 6 ,16400,'2013-10-18 14:57:43' union all
select 6 ,16100,'2013-10-18 14:51:43' union all
select 6 ,16300,'2013-10-16 14:57:43' union all
select 5 ,7100,'2013-10-16 16:06:09' union all
select 3 ,11200,'2013-10-16 20:44:58' union all
select 6 ,16100,'2013-10-18 14:57:43' union all
select 1 ,8300,'2013-10-16 10:49:04'
 
;with cte as(
select * ,row_number() over(partition by [uid],convert(varchar(10),utime,120) order by [uscore] desc) rownumberid from #t  
 
)
select * from cte where rownumberid=1
-------------

(11 行受影响)
uid         uscore      utime                   rownumberid
----------- ----------- ----------------------- --------------------
1           8800        2013-10-12 10:49:04.000 1
1           8300        2013-10-16 10:49:04.000 1
3           11400       2013-10-15 21:55:58.000 1
3           11200       2013-10-16 20:44:58.000 1
5           7200        2013-10-14 16:06:09.000 1
5           7100        2013-10-16 16:06:09.000 1
6           16300       2013-10-16 14:57:43.000 1
6           16400       2013-10-18 14:57:43.000 1

(8 行受影响)


#12


引用 6 楼 DBA_Huangzj 的回复:
Quote: 引用 2 楼 yangsh0722 的回复:


SELECT uid,MAX(uscore) AS uscore,CONVERT(VARCHAR(10),utime,120) AS utime 
FROM tb WITH(NOLOCK)
GROUP BY uid,CONVERT(VARCHAR(10),utime,120)
ORDER BY MAX(uscore) DESC
拉到最下面

哥,下班不多呆一分钟,走人,晚饭多吃点

#13


引用 9 楼 yangsh0722 的回复:
Quote: 引用 6 楼 DBA_Huangzj 的回复:

Quote: 引用 2 楼 yangsh0722 的回复:


SELECT uid,MAX(uscore) AS uscore,CONVERT(VARCHAR(10),utime,120) AS utime 
FROM tb WITH(NOLOCK)
GROUP BY uid,CONVERT(VARCHAR(10),utime,120)
ORDER BY MAX(uscore) DESC
拉到最下面


SELECT CONVERT(CHAR(10),GETDATE(),23)
SELECT CONVERT(CHAR(10),GETDATE(),120)
----------
2013-10-22

(1 行受影响)


----------
2013-10-22

(1 行受影响)

截取前10位是一样的 求助关于sql一段时间内重复记录的问题
强行截取我不保证不丢失

#14




if object_id('tb') is not null 
   drop table tb
go

create table tb
(
uid int   null,
uscore int null,
utime datetime null


Insert Into tb
select 1,8800,'2013-10-12 10:49:04' union all
select 3,11300,'2013-10-15 20:44:58' union all
select 5 ,7200,'2013-10-14 16:06:09' union all
select 6 ,16400,'2013-10-18 14:57:43' union all
select 6 ,16300,'2013-10-16 14:57:43' union all
select 5 ,7100,'2013-10-16 16:06:09' union all
select 3 ,11200,'2013-10-16 20:44:58' union all
select 6 ,16100,'2013-10-18 14:57:43' union all
select 1 ,8300,'2013-10-16 10:49:04'
 
;with t 
as
(
select uid,
       uscore,
       utime,
       row_number() over(partition by uid 
                             order by uscore desc) as rownum
from tb  
--如果只需要某个时间段的,那么加上where就可以
--where (Utime BETWEEN  '2013/10/18' and '2013/10/19')
)

select uid,
       uscore,
       utime,
       dense_rank() over(order by uscore desc) as '排名'
from t
where rownum = 1
/*
uid         uscore      utime                   排名
----------- ----------- ----------------------- --------------------
6           16400       2013-10-18 14:57:43.000 1
3           11300       2013-10-15 20:44:58.000 2
1           8800        2013-10-12 10:49:04.000 3
5           7200        2013-10-14 16:06:09.000 4
*/

#15


这个是,在某一天的排名情况,需要过滤时间:


if object_id('tb') is not null 
   drop table tb
go

create table tb
(
uid int   null,
uscore int null,
utime datetime null


Insert Into tb
select 1,8800,'2013-10-12 10:49:04' union all
select 3,11300,'2013-10-15 20:44:58' union all
select 5 ,7200,'2013-10-14 16:06:09' union all
select 6 ,16400,'2013-10-18 14:57:43' union all
select 6 ,16300,'2013-10-16 14:57:43' union all
select 5 ,7100,'2013-10-16 16:06:09' union all
select 3 ,11200,'2013-10-16 20:44:58' union all
select 6 ,16100,'2013-10-18 14:57:43' union all
select 1 ,8300,'2013-10-16 10:49:04'
 
;with t 
as
(
select uid,
       uscore,
       utime,
       row_number() over(partition by uid 
                             order by uscore desc) as rownum
from tb  
where utime >= '2013-10-16' and
      utime < '2013-10-17'
)

select uid,
       uscore,
       utime,
       dense_rank() over(order by uscore desc) as '排名'
from t
where rownum = 1
/*
uid         uscore      utime                   排名
----------- ----------- ----------------------- --------------------
6           16300       2013-10-16 14:57:43.000 1
3           11200       2013-10-16 20:44:58.000 2
1           8300        2013-10-16 10:49:04.000 3
5           7100        2013-10-16 16:06:09.000 4
*/

#16


引用 1 楼 DBA_Huangzj 的回复:
日期筛选你自己加where条件即可
----------------------------------------------------------------
-- Author  :DBA_Huangzj(發糞塗牆)
-- Date    :2013-10-22 17:10:34
-- Version:
--      Microsoft SQL Server 2012 (SP1) - 11.0.3128.0 (X64) 
-- Dec 28 2012 20:23:12 
-- Copyright (c) Microsoft Corporation
-- Enterprise Edition (64-bit) on Windows NT 6.2 <X64> (Build 9200: ) (Hypervisor)
--
----------------------------------------------------------------
--> 测试数据:[huang]
if object_id('[huang]') is not null drop table [huang]
go 
create table [huang]([uid] int,[uscore] int,[utime] datetime)
insert [huang]
select 1,8800,'2013-10-12 10:49:04' union all
select 3,11300,'2013-10-15 20:44:58' union all
select 5,7200,'2013-10-14 16:06:09' union all
select 6,16400,'2013-10-18 14:57:43' union all
select 6,16300,'2013-10-16 14:57:43' union all
select 5,7100,'2013-10-16 16:06:09' union all
select 3,11200,'2013-10-16 20:44:58' union all
select 6,16100,'2013-10-18 14:57:43' union all
select 1,8300,'2013-10-16 10:49:04'
--------------开始查询--------------------------

select *
 from [huang] a
 WHERE EXISTS (SELECT 1 FROM (SELECT [uid],MAX([uscore])[uscore],CONVERT(CHAR(10),[utime],23) [utime] FROM huang GROUP BY  [uid],CONVERT(CHAR(10),[utime],23))b
 WHERE CONVERT(CHAR(10),a.[utime],23)=b.utime AND a.[uid]=b.[uid] AND a.uscore=b.uscore)
----------------结果----------------------------
/* 
uid         uscore      utime
----------- ----------- -----------------------
1           8800        2013-10-12 10:49:04.000
3           11300       2013-10-15 20:44:58.000
5           7200        2013-10-14 16:06:09.000
6           16400       2013-10-18 14:57:43.000
6           16300       2013-10-16 14:57:43.000
5           7100        2013-10-16 16:06:09.000
3           11200       2013-10-16 20:44:58.000
1           8300        2013-10-16 10:49:04.000
*/


朋友 你好 我可能没有说清楚,
sql查询语句是用到asp程序里面来查询的,时间是范围是年月日小时分秒 这样的,
总排行是 每个用户 只显示一条数据 得分只显示 该用户得分最高的一次记录,
如果指定时间范围,就显示在该范围内 该用户得分最高的一次记录。

#17


引用 15 楼 yupeigu 的回复:
这个是,在某一天的排名情况,需要过滤时间:


if object_id('tb') is not null 
   drop table tb
go

create table tb
(
uid int   null,
uscore int null,
utime datetime null


Insert Into tb
select 1,8800,'2013-10-12 10:49:04' union all
select 3,11300,'2013-10-15 20:44:58' union all
select 5 ,7200,'2013-10-14 16:06:09' union all
select 6 ,16400,'2013-10-18 14:57:43' union all
select 6 ,16300,'2013-10-16 14:57:43' union all
select 5 ,7100,'2013-10-16 16:06:09' union all
select 3 ,11200,'2013-10-16 20:44:58' union all
select 6 ,16100,'2013-10-18 14:57:43' union all
select 1 ,8300,'2013-10-16 10:49:04'
 
;with t 
as
(
select uid,
       uscore,
       utime,
       row_number() over(partition by uid 
                             order by uscore desc) as rownum
from tb  
where utime >= '2013-10-16' and
      utime < '2013-10-17'
)

select uid,
       uscore,
       utime,
       dense_rank() over(order by uscore desc) as '排名'
from t
where rownum = 1
/*
uid         uscore      utime                   排名
----------- ----------- ----------------------- --------------------
6           16300       2013-10-16 14:57:43.000 1
3           11200       2013-10-16 20:44:58.000 2
1           8300        2013-10-16 10:49:04.000 3
5           7100        2013-10-16 16:06:09.000 4
*/


朋友你好 你这个效果就是我想要的,但是这个如何放在asp的查询语句里呢,好像和常写的查询代码不太一样

#18


引用 2 楼 yangsh0722 的回复:

SELECT uid,MAX(uscore) AS uscore,CONVERT(VARCHAR(10),utime,120) AS utime 
FROM tb WITH(NOLOCK)
GROUP BY uid,CONVERT(VARCHAR(10),utime,120)
ORDER BY MAX(uscore) DESC


你好 代码我测试了,发现用户记录有重复的,我只想在某个时间范围内每个用户只显示最高得分的记录,
查询语句是放在asp查询里 

谢谢

#19


----------------------------------------------------------------
-- Author  :DBA_Huangzj(發糞塗牆)
-- Date    :2013-10-22 17:10:34
-- Version:
--      Microsoft SQL Server 2012 (SP1) - 11.0.3128.0 (X64) 
--    Dec 28 2012 20:23:12 
--    Copyright (c) Microsoft Corporation
--    Enterprise Edition (64-bit) on Windows NT 6.2 <X64> (Build 9200: ) (Hypervisor)
--
----------------------------------------------------------------
--> 测试数据:[huang]
if object_id('[huang]') is not null drop table [huang]
go 
create table [huang]([uid] int,[uscore] int,[utime] datetime)
insert [huang]
select 1,8800,'2013-10-12 10:49:04' union all
select 3,11300,'2013-10-15 20:44:58' union all
select 5,7200,'2013-10-14 16:06:09' union all
select 6,16400,'2013-10-18 14:57:43' union all
select 6,16300,'2013-10-16 14:57:43' union all
select 5,7100,'2013-10-16 16:06:09' union all
select 3,11200,'2013-10-16 20:44:58' union all
select 6,16100,'2013-10-18 14:57:43' union all
select 1,8300,'2013-10-16 10:49:04'
--------------开始查询--------------------------
 
select *
 from [huang] a
 WHERE EXISTS (SELECT 1 FROM (SELECT [uid],MAX([uscore])[uscore] FROM huang --如果需要筛选日期,加where条件在这里
  GROUP BY  [uid])b
 WHERE  a.[uid]=b.[uid] AND a.uscore=b.uscore)

 /*
 uid         uscore      utime
----------- ----------- -----------------------
1           8800        2013-10-12 10:49:04.000
3           11300       2013-10-15 20:44:58.000
5           7200        2013-10-14 16:06:09.000
6           16400       2013-10-18 14:57:43.000
 */

#20


引用 17 楼 lanzengquan 的回复:
Quote: 引用 15 楼 yupeigu 的回复:

这个是,在某一天的排名情况,需要过滤时间:


if object_id('tb') is not null 
   drop table tb
go

create table tb
(
uid int   null,
uscore int null,
utime datetime null


Insert Into tb
select 1,8800,'2013-10-12 10:49:04' union all
select 3,11300,'2013-10-15 20:44:58' union all
select 5 ,7200,'2013-10-14 16:06:09' union all
select 6 ,16400,'2013-10-18 14:57:43' union all
select 6 ,16300,'2013-10-16 14:57:43' union all
select 5 ,7100,'2013-10-16 16:06:09' union all
select 3 ,11200,'2013-10-16 20:44:58' union all
select 6 ,16100,'2013-10-18 14:57:43' union all
select 1 ,8300,'2013-10-16 10:49:04'
 
;with t 
as
(
select uid,
       uscore,
       utime,
       row_number() over(partition by uid 
                             order by uscore desc) as rownum
from tb  
where utime >= '2013-10-16' and
      utime < '2013-10-17'
)

select uid,
       uscore,
       utime,
       dense_rank() over(order by uscore desc) as '排名'
from t
where rownum = 1
/*
uid         uscore      utime                   排名
----------- ----------- ----------------------- --------------------
6           16300       2013-10-16 14:57:43.000 1
3           11200       2013-10-16 20:44:58.000 2
1           8300        2013-10-16 10:49:04.000 3
5           7100        2013-10-16 16:06:09.000 4
*/


朋友你好 你这个效果就是我想要的,但是这个如何放在asp的查询语句里呢,好像和常写的查询代码不太一样


哦,你的数据库时2005及以后的吗?

#21


引用 20 楼 yupeigu 的回复:
Quote: 引用 17 楼 lanzengquan 的回复:

Quote: 引用 15 楼 yupeigu 的回复:

这个是,在某一天的排名情况,需要过滤时间:


if object_id('tb') is not null 
   drop table tb
go

create table tb
(
uid int   null,
uscore int null,
utime datetime null


Insert Into tb
select 1,8800,'2013-10-12 10:49:04' union all
select 3,11300,'2013-10-15 20:44:58' union all
select 5 ,7200,'2013-10-14 16:06:09' union all
select 6 ,16400,'2013-10-18 14:57:43' union all
select 6 ,16300,'2013-10-16 14:57:43' union all
select 5 ,7100,'2013-10-16 16:06:09' union all
select 3 ,11200,'2013-10-16 20:44:58' union all
select 6 ,16100,'2013-10-18 14:57:43' union all
select 1 ,8300,'2013-10-16 10:49:04'
 
;with t 
as
(
select uid,
       uscore,
       utime,
       row_number() over(partition by uid 
                             order by uscore desc) as rownum
from tb  
where utime >= '2013-10-16' and
      utime < '2013-10-17'
)

select uid,
       uscore,
       utime,
       dense_rank() over(order by uscore desc) as '排名'
from t
where rownum = 1
/*
uid         uscore      utime                   排名
----------- ----------- ----------------------- --------------------
6           16300       2013-10-16 14:57:43.000 1
3           11200       2013-10-16 20:44:58.000 2
1           8300        2013-10-16 10:49:04.000 3
5           7100        2013-10-16 16:06:09.000 4
*/


朋友你好 你这个效果就是我想要的,但是这个如何放在asp的查询语句里呢,好像和常写的查询代码不太一样


哦,你的数据库时2005及以后的吗?


是sql2005的

#22


引用 19 楼 DBA_Huangzj 的回复:
----------------------------------------------------------------
-- Author  :DBA_Huangzj(發糞塗牆)
-- Date    :2013-10-22 17:10:34
-- Version:
--      Microsoft SQL Server 2012 (SP1) - 11.0.3128.0 (X64) 
--    Dec 28 2012 20:23:12 
--    Copyright (c) Microsoft Corporation
--    Enterprise Edition (64-bit) on Windows NT 6.2 <X64> (Build 9200: ) (Hypervisor)
--
----------------------------------------------------------------
--> 测试数据:[huang]
if object_id('[huang]') is not null drop table [huang]
go 
create table [huang]([uid] int,[uscore] int,[utime] datetime)
insert [huang]
select 1,8800,'2013-10-12 10:49:04' union all
select 3,11300,'2013-10-15 20:44:58' union all
select 5,7200,'2013-10-14 16:06:09' union all
select 6,16400,'2013-10-18 14:57:43' union all
select 6,16300,'2013-10-16 14:57:43' union all
select 5,7100,'2013-10-16 16:06:09' union all
select 3,11200,'2013-10-16 20:44:58' union all
select 6,16100,'2013-10-18 14:57:43' union all
select 1,8300,'2013-10-16 10:49:04'
--------------开始查询--------------------------
 
select *
 from [huang] a
 WHERE EXISTS (SELECT 1 FROM (SELECT [uid],MAX([uscore])[uscore] FROM huang --如果需要筛选日期,加where条件在这里
  GROUP BY  [uid])b
 WHERE  a.[uid]=b.[uid] AND a.uscore=b.uscore)

 /*
 uid         uscore      utime
----------- ----------- -----------------------
1           8800        2013-10-12 10:49:04.000
3           11300       2013-10-15 20:44:58.000
5           7200        2013-10-14 16:06:09.000
6           16400       2013-10-18 14:57:43.000
 */


在你标注的地方 加了where  utime>'2013-10-12' 生成的结果 又出现重复的用户数据

#23


引用 21 楼 lanzengquan 的回复:
Quote: 引用 20 楼 yupeigu 的回复:

Quote: 引用 17 楼 lanzengquan 的回复:

Quote: 引用 15 楼 yupeigu 的回复:

这个是,在某一天的排名情况,需要过滤时间:


if object_id('tb') is not null 
   drop table tb
go

create table tb
(
uid int   null,
uscore int null,
utime datetime null


Insert Into tb
select 1,8800,'2013-10-12 10:49:04' union all
select 3,11300,'2013-10-15 20:44:58' union all
select 5 ,7200,'2013-10-14 16:06:09' union all
select 6 ,16400,'2013-10-18 14:57:43' union all
select 6 ,16300,'2013-10-16 14:57:43' union all
select 5 ,7100,'2013-10-16 16:06:09' union all
select 3 ,11200,'2013-10-16 20:44:58' union all
select 6 ,16100,'2013-10-18 14:57:43' union all
select 1 ,8300,'2013-10-16 10:49:04'
 
;with t 
as
(
select uid,
       uscore,
       utime,
       row_number() over(partition by uid 
                             order by uscore desc) as rownum
from tb  
where utime >= '2013-10-16' and
      utime < '2013-10-17'
)

select uid,
       uscore,
       utime,
       dense_rank() over(order by uscore desc) as '排名'
from t
where rownum = 1
/*
uid         uscore      utime                   排名
----------- ----------- ----------------------- --------------------
6           16300       2013-10-16 14:57:43.000 1
3           11200       2013-10-16 20:44:58.000 2
1           8300        2013-10-16 10:49:04.000 3
5           7100        2013-10-16 16:06:09.000 4
*/


朋友你好 你这个效果就是我想要的,但是这个如何放在asp的查询语句里呢,好像和常写的查询代码不太一样


哦,你的数据库时2005及以后的吗?


是sql2005的


哦,那就完全没问题了,上面的写法就是适合2005版本的写法,比较简洁,用的是with表达式写的,看上去确实和平时写的不太一样,直接把这个语句放进去就可以,和普通的语句是一样的,注意with左边的分号是必须的:

;with t 
as
(
select uid,
       uscore,
       utime,
       row_number() over(partition by uid 
                             order by uscore desc) as rownum
from tb  
where utime >= '2013-10-16' and
      utime < '2013-10-17'
)
 
select uid,
       uscore,
       utime,
       dense_rank() over(order by uscore desc) as '排名'
from t  where rownum = 1

#24


引用 23 楼 yupeigu 的回复:
Quote: 引用 21 楼 lanzengquan 的回复:

Quote: 引用 20 楼 yupeigu 的回复:

Quote: 引用 17 楼 lanzengquan 的回复:

Quote: 引用 15 楼 yupeigu 的回复:

这个是,在某一天的排名情况,需要过滤时间:


if object_id('tb') is not null 
   drop table tb
go

create table tb
(
uid int   null,
uscore int null,
utime datetime null


Insert Into tb
select 1,8800,'2013-10-12 10:49:04' union all
select 3,11300,'2013-10-15 20:44:58' union all
select 5 ,7200,'2013-10-14 16:06:09' union all
select 6 ,16400,'2013-10-18 14:57:43' union all
select 6 ,16300,'2013-10-16 14:57:43' union all
select 5 ,7100,'2013-10-16 16:06:09' union all
select 3 ,11200,'2013-10-16 20:44:58' union all
select 6 ,16100,'2013-10-18 14:57:43' union all
select 1 ,8300,'2013-10-16 10:49:04'
 
;with t 
as
(
select uid,
       uscore,
       utime,
       row_number() over(partition by uid 
                             order by uscore desc) as rownum
from tb  
where utime >= '2013-10-16' and
      utime < '2013-10-17'
)

select uid,
       uscore,
       utime,
       dense_rank() over(order by uscore desc) as '排名'
from t
where rownum = 1
/*
uid         uscore      utime                   排名
----------- ----------- ----------------------- --------------------
6           16300       2013-10-16 14:57:43.000 1
3           11200       2013-10-16 20:44:58.000 2
1           8300        2013-10-16 10:49:04.000 3
5           7100        2013-10-16 16:06:09.000 4
*/


朋友你好 你这个效果就是我想要的,但是这个如何放在asp的查询语句里呢,好像和常写的查询代码不太一样


哦,你的数据库时2005及以后的吗?


是sql2005的


哦,那就完全没问题了,上面的写法就是适合2005版本的写法,比较简洁,用的是with表达式写的,看上去确实和平时写的不太一样,直接把这个语句放进去就可以,和普通的语句是一样的,注意with左边的分号是必须的:

;with t 
as
(
select uid,
       uscore,
       utime,
       row_number() over(partition by uid 
                             order by uscore desc) as rownum
from tb  
where utime >= '2013-10-16' and
      utime < '2013-10-17'
)
 
select uid,
       uscore,
       utime,
       dense_rank() over(order by uscore desc) as '排名'
from t  where rownum = 1


好像放在asp的查询里没法运行,一运行iis就死了

#25


引用 22 楼 lanzengquan 的回复:
Quote: 引用 19 楼 DBA_Huangzj 的回复:

----------------------------------------------------------------
-- Author  :DBA_Huangzj(發糞塗牆)
-- Date    :2013-10-22 17:10:34
-- Version:
--      Microsoft SQL Server 2012 (SP1) - 11.0.3128.0 (X64) 
--    Dec 28 2012 20:23:12 
--    Copyright (c) Microsoft Corporation
--    Enterprise Edition (64-bit) on Windows NT 6.2 <X64> (Build 9200: ) (Hypervisor)
--
----------------------------------------------------------------
--> 测试数据:[huang]
if object_id('[huang]') is not null drop table [huang]
go 
create table [huang]([uid] int,[uscore] int,[utime] datetime)
insert [huang]
select 1,8800,'2013-10-12 10:49:04' union all
select 3,11300,'2013-10-15 20:44:58' union all
select 5,7200,'2013-10-14 16:06:09' union all
select 6,16400,'2013-10-18 14:57:43' union all
select 6,16300,'2013-10-16 14:57:43' union all
select 5,7100,'2013-10-16 16:06:09' union all
select 3,11200,'2013-10-16 20:44:58' union all
select 6,16100,'2013-10-18 14:57:43' union all
select 1,8300,'2013-10-16 10:49:04'
--------------开始查询--------------------------
 
select *
 from [huang] a
 WHERE EXISTS (SELECT 1 FROM (SELECT [uid],MAX([uscore])[uscore] FROM huang --如果需要筛选日期,加where条件在这里
  GROUP BY  [uid])b
 WHERE  a.[uid]=b.[uid] AND a.uscore=b.uscore)

 /*
 uid         uscore      utime
----------- ----------- -----------------------
1           8800        2013-10-12 10:49:04.000
3           11300       2013-10-15 20:44:58.000
5           7200        2013-10-14 16:06:09.000
6           16400       2013-10-18 14:57:43.000
 */


在你标注的地方 加了where  utime>'2013-10-12' 生成的结果 又出现重复的用户数据


出现重复的用户数据 是因为该用户在一段时间内得分相同,就都统计出来了,
还有个问题 我加了时间范围,该用户在相同得分的几条记录里,9月份的数据也会显示出来

#26


引用 24 楼 lanzengquan 的回复:
Quote: 引用 23 楼 yupeigu 的回复:

Quote: 引用 21 楼 lanzengquan 的回复:

Quote: 引用 20 楼 yupeigu 的回复:

Quote: 引用 17 楼 lanzengquan 的回复:

Quote: 引用 15 楼 yupeigu 的回复:

这个是,在某一天的排名情况,需要过滤时间:


if object_id('tb') is not null 
   drop table tb
go

create table tb
(
uid int   null,
uscore int null,
utime datetime null


Insert Into tb
select 1,8800,'2013-10-12 10:49:04' union all
select 3,11300,'2013-10-15 20:44:58' union all
select 5 ,7200,'2013-10-14 16:06:09' union all
select 6 ,16400,'2013-10-18 14:57:43' union all
select 6 ,16300,'2013-10-16 14:57:43' union all
select 5 ,7100,'2013-10-16 16:06:09' union all
select 3 ,11200,'2013-10-16 20:44:58' union all
select 6 ,16100,'2013-10-18 14:57:43' union all
select 1 ,8300,'2013-10-16 10:49:04'
 
;with t 
as
(
select uid,
       uscore,
       utime,
       row_number() over(partition by uid 
                             order by uscore desc) as rownum
from tb  
where utime >= '2013-10-16' and
      utime < '2013-10-17'
)

select uid,
       uscore,
       utime,
       dense_rank() over(order by uscore desc) as '排名'
from t
where rownum = 1
/*
uid         uscore      utime                   排名
----------- ----------- ----------------------- --------------------
6           16300       2013-10-16 14:57:43.000 1
3           11200       2013-10-16 20:44:58.000 2
1           8300        2013-10-16 10:49:04.000 3
5           7100        2013-10-16 16:06:09.000 4
*/


朋友你好 你这个效果就是我想要的,但是这个如何放在asp的查询语句里呢,好像和常写的查询代码不太一样


哦,你的数据库时2005及以后的吗?


是sql2005的


哦,那就完全没问题了,上面的写法就是适合2005版本的写法,比较简洁,用的是with表达式写的,看上去确实和平时写的不太一样,直接把这个语句放进去就可以,和普通的语句是一样的,注意with左边的分号是必须的:

;with t 
as
(
select uid,
       uscore,
       utime,
       row_number() over(partition by uid 
                             order by uscore desc) as rownum
from tb  
where utime >= '2013-10-16' and
      utime < '2013-10-17'
)
 
select uid,
       uscore,
       utime,
       dense_rank() over(order by uscore desc) as '排名'
from t  where rownum = 1


好像放在asp的查询里没法运行,一运行iis就死了


我把语句改写了一下,试试:
select [uid],uscore,utime,dense_rank() over(order by uscore desc) as r
from
(
select [uid],uscore,utime,row_number() over(partition by uid order by uscore desc) as rownum
from tb where utime >= '2013-10-16' and utime < '2013-10-17'
)t where rownum = 1  

#27


改了一下:
select uid,uscore,utime,dense_rank() over(order by uscore desc) as r
from
(
select uid,uscore,utime,row_number() over(partition by uid order by uscore desc) as rownum
from tb where utime >= '2013-10-16' and utime < '2013-10-17'
)t where rownum = 1

#28


引用 27 楼 yupeigu 的回复:
改了一下:
select uid,uscore,utime,dense_rank() over(order by uscore desc) as r
from
(
select uid,uscore,utime,row_number() over(partition by uid order by uscore desc) as rownum
from tb where utime >= '2013-10-16' and utime < '2013-10-17'
)t where rownum = 1


这个可以用 兄弟 你真牛啊 
最后一个问题 现在可以筛选出某一时段的用户排行 
但是分数相同的 显示排名也相同 
如果改为按照123。。。。 99 100这样的排名 要修改哪里

#29


引用 28 楼 lanzengquan 的回复:
Quote: 引用 27 楼 yupeigu 的回复:

改了一下:
select uid,uscore,utime,dense_rank() over(order by uscore desc) as r
from
(
select uid,uscore,utime,row_number() over(partition by uid order by uscore desc) as rownum
from tb where utime >= '2013-10-16' and utime < '2013-10-17'
)t where rownum = 1


这个可以用 兄弟 你真牛啊 
最后一个问题 现在可以筛选出某一时段的用户排行 
但是分数相同的 显示排名也相同 
如果改为按照123。。。。 99 100这样的排名 要修改哪里


你的意思是,分数一样的,排名要不同是把,比如就是1,2,3,而不是1,1,2,3是吧,
我改了一下了,分数一样,也会往下排,你试试:

select uid,uscore,utime,row_number() over(order by uscore desc) as r
from
(
select uid,uscore,utime,row_number() over(partition by uid order by uscore desc) as rownum
from tb where utime >= '2013-10-16' and utime < '2013-10-17'
)t where rownum = 1


#30


引用 29 楼 yupeigu 的回复:
Quote: 引用 28 楼 lanzengquan 的回复:

Quote: 引用 27 楼 yupeigu 的回复:

改了一下:
select uid,uscore,utime,dense_rank() over(order by uscore desc) as r
from
(
select uid,uscore,utime,row_number() over(partition by uid order by uscore desc) as rownum
from tb where utime >= '2013-10-16' and utime < '2013-10-17'
)t where rownum = 1


这个可以用 兄弟 你真牛啊 
最后一个问题 现在可以筛选出某一时段的用户排行 
但是分数相同的 显示排名也相同 
如果改为按照123。。。。 99 100这样的排名 要修改哪里


你的意思是,分数一样的,排名要不同是把,比如就是1,2,3,而不是1,1,2,3是吧,
我改了一下了,分数一样,也会往下排,你试试:

select uid,uscore,utime,row_number() over(order by uscore desc) as r
from
(
select uid,uscore,utime,row_number() over(partition by uid order by uscore desc) as rownum
from tb where utime >= '2013-10-16' and utime < '2013-10-17'
)t where rownum = 1





通过测试,太给力了,非常谢谢,兄弟