我是通过上面这种方式,取到的员工的最后打卡时间。
<br/>
<font color="red">但如果,有很多员工,我要获取他们每一个人的最后一次打卡时间呢?</font>
select user_code,max(clock_in_time) from tb_vp_clock_in group by user_code
感谢,陷入思维误区了,总想着把查询条件放到where后
根据时间拍下序 根据usercode取第一条数据就行了
这样的
@IT小白鸽: 这样不行,只会出来一条数据:
分组求最大值,group by usercode
我尝试过分组,但是对应的打卡时间并不是最后的打卡时间啊
正解,需要按usercode 和 create_time的年月日进行分组,然后查询min,max.
另外建议不要使用in,in的效率低下,使用in意味着需要全表扫描,直接用usercode=?
@Yoooshiki:
你的数据中打卡日期和时间和合并存储在同一列的,也就是说没有单独的 日期列。
而你的需求是要获取每个用户在每天最后一次打卡的时间。
所以,分组时,不仅要使用usercode,还要根据从clock_in_time列中分离出的日期来分组。
参考:“... group by usercode ,convert(char(10),clock_in_time,120) ......”
支持分组获取日期最大值,然后再关联,获取全部信息
第一次在博客园回复:
1.如果是Oracle:可以使用rownumber_over(partition by column1 order by colomn2)来达到你的要求;
2.如果是Mysql:可以使用一下类似语法:
SELECT
IF(t1.id = @id,@rownum := @rownum + 1,@rownum := 1)AS rownum,
t1.*,
@id := t1.id
FROM
(SELECT
@rownum := 0,@id := NULL) r,
test1 t1
ORDER BY t1.id,t1.starttime DESC
语法解析:
以id和starttime进行排序可以理解为id分组内starttime排序;
test1表关联@rownum :=0,@id :=null,在select中if判断@id是否等于当前行的id,因为初始为null,所以@rownum :=1,当id变化的时候,@id还是上一个id的值,此时@rownum重置为1,注意@id :=t1.id一定要放在if判断后面。
3.如果是其他数据库,可根据Oracle的语法去自行查找
朋友,你是大神,可惜看不懂你的sql, 不管怎么说,膜拜
@Yoooshiki:我也只是个小菜鸟,只是比你多飞了一会,这些百度上都是可以搜到的