2014-10-05 77 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