首页 新闻 搜索 专区 学院

一个mssql问题。有关聚合排序

0
悬赏园豆:20 [已解决问题] 解决于 2010-12-16 17:15

PERSONID TIMECARDDATE TIMECARDTIME
2171393 2010-10-12 18:00:00
2171393 2010-10-12 13:00:00
2171396 2010-10-11 16:00:00
2171396 2010-10-11 13:30:00
2171396 2010-10-11 12:00:00
2171393 2010-10-11 11:30:00

我要得到这样的结果

2171393 2010-10-12 18:00:00
2171393 2010-10-12 13:00:00

 

每个PERSONID 最晚的时间。。求解。。。

问题补充: 日期和时间是两个字段。。 拼接时间排序的方法可取。。 可是万一是要去最晚的那天,。。,最早的刷卡时间。。这个问题怎么办。。
leoD的主页 leoD | 初学一级 | 园豆:0
提问于:2010-12-14 15:49
< >
分享
最佳答案
0
SELECT personid,timecarddate,timecardtime
FROM
(
SELECT *,row_number()OVER(partition BY personid ORDER BY timecarddate DESC,timecardtime DESC) AS rowno
FROM
[YouTableName]
)a
WHERE rowno=1

这里使用了排名函数和窗口函数进行分组和排序,最终效果是分成“
2171393”和“2171396”两组,
并且按照最大的日期和时间进行了排名,然后选择每组中排名为1的记录就是我们想要的结果了。
如果你想取最晚那天,最早的刷卡时间只要把
ORDER BY timecarddate DESC,timecardtime DESC
改成
ORDER BY timecarddate DESC,timecardtime ASC
就行了。
收获园豆:20
流水殇 | 菜鸟二级 |园豆:404 | 2010-12-16 15:15
其他回答(2)
0

Select PERSONID,max(TIMECARDDATE + TIMECARDTIME) From t
group by PERSONID

彭汉生 | 园豆:1233 (小虾三级) | 2010-12-14 16:07
我也是这么写的。比较牵强。 可是万一是取最晚那天,最早的刷卡时间,怎么办。。
支持(0) 反对(0) leoD | 园豆:0 (初学一级) | 2010-12-14 16:09
你为什么将日期和时间分成两个字段?
支持(0) 反对(0) 彭汉生 | 园豆:1233 (小虾三级) | 2010-12-14 16:12
这个项目所有的日期和时间都是两个字段。用处就不说了。。。
支持(0) 反对(0) leoD | 园豆:0 (初学一级) | 2010-12-14 16:14
Select PERSONID,max(TIMECARDDATE) + max(TIMECARDTIME) From T group by PERSONID Select PERSONID,max(TIMECARDDATE) + min(TIMECARDTIME) From T group by PERSONID
支持(0) 反对(0) 彭汉生 | 园豆:1233 (小虾三级) | 2010-12-14 16:19
0
select * from [tablename] a
cross apply (select top 1 * from [tablename]
where a.PERSONID=PERSONID
order by TIMECARDDATE,TIMECARDTIME desc
) b
追索 | 园豆:625 (小虾三级) | 2010-12-14 16:12
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册