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 最晚的时间。。求解。。。
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
就行了。
Select PERSONID,max(TIMECARDDATE + TIMECARDTIME) From t
group by PERSONID
select * from [tablename] a
cross apply (select top 1 * from [tablename]
where a.PERSONID=PERSONID
order by TIMECARDDATE,TIMECARDTIME desc
) b