2014-10-05 43 views
3
  • 我有识别表的学生,SID,CHECKID,DATE
  • 这里ID:TABLEID(自动递增),SID:studentID,CHECKID:0/1(即IN/OUT ),DATE。
  • 当学生进入教室时,他会通过卡片节省每天的出勤。
  • 我有数据是如何让学生详细SQL查询

    ID SID CHECKID DATE

    --- --- -------- -----

    0 101 0 04-10- 2013 10:00:00

    1 101 1 2013年4月10日11时30分00秒

    2 101 0 2013年4月10日14点15分00秒

  • 我试图像查询:

    由SID

  • 从学生选择DISTINCT SID,MAX(DATE),CHECKID其中SID = '101' 组然后我得到的结果作为两个记录。

  • 我需要的记录是最大日期(即特定学生的最近记录),如:仅限第3条记录。

  • 任何help.thanks提前。

+0

您使用的是MySQL还是Oracle?你标记了两个,但它们是非常不同的数据库。 – 2014-10-05 14:12:58

+0

感谢Brian ReMilia的重播。使用Oracle。 – kks 2014-10-05 14:15:49

回答

4

最快的办法可能是使用的解析函数:

select * 
    from (select s.*, 
       row_number() over(partition by sid order by date desc) as rn 
      from student s) 
where rn = 1 

另一种方式是一个相关子查询:

select * 
    from student s 
where date = (select max(x.date) from student x where x.sid = s.sid) 

另一种方法是加入到内嵌视图:

select s.* 
    from student s 
    join (select sid, max(date) as sid_last_date from student group by sid) v 
    on s.sid = v.sid 
    and s.date = v.sid_last_date 
+1

感谢它为我工作,当我添加** select * 从学生s 其中date =(从学生x选择max(x.date)x其中x.sid = s.sid)和s.sid ='101'* * – kks 2014-10-05 14:23:25

+1

@kks我没有意识到你对某个特定的学生感兴趣,只是在where子句中添加了一些特定的人。上述查询将过滤每个学生的最后一个有效日期行。之后,你可以自由地过滤其他任何东西。 – 2014-10-05 14:25:44