从表中select行的最大date的信息

我的表看起来像这样:

group date cash checks 1 1/1/2013 0 0 2 1/1/2013 0 800 1 1/3/2013 0 700 3 1/1/2013 0 600 1 1/2/2013 0 400 3 1/5/2013 0 200 

– 不需要现金就可以显示表格中有更多信息

我想得到每个独特的组,其中date是最大的,并且检查是大于0.所以返回看起来像这样:

 group date checks 2 1/1/2013 800 1 1/3/2013 700 3 1/5/2013 200 

尝试的代码:

 SELECT group,MAX(date),checks FROM table WHERE checks>0 GROUP BY group ORDER BY group DESC 

问题,虽然它给了我所有的date和检查,而不仅仅是最大date行。

使用ms sql server 2005

 SELECT group,MAX(date) as max_date FROM table WHERE checks>0 GROUP BY group 

这工作得到最大date..join它回到您的数据,以获得其他列:

 Select group,max_date,checks from table t inner join (SELECT group,MAX(date) as max_date FROM table WHERE checks>0 GROUP BY group)a on a.group = t.group and a.max_date = date 

内部连接function作为获取最大logging的筛选器。

仅供参考,你的列名是可怕的,不要使用保留字的列(组,date,表)。

你可以像这样使用一个MAX() 窗口 :

 SELECT *, max_date = MAX(date) OVER (PARTITION BY group ) FROM table 

group获得最大date以及其他数据:

 group date cash checks max_date ----- -------- ---- ------ -------- 1 1/1/2013 0 0 1/3/2013 2 1/1/2013 0 800 1/1/2013 1 1/3/2013 0 700 1/3/2013 3 1/1/2013 0 600 1/5/2013 1 1/2/2013 0 400 1/3/2013 3 1/5/2013 0 200 1/5/2013 

使用上面的输出作为派生表,然后可以只获取date匹配max_date行:

 SELECT group , date, checks FROM ( SELECT *, max_date = MAX(date) OVER (PARTITION BY group ) FROM table ) AS s WHERE date = max_date ; 

得到期望的结果。

基本上,这与@十二号的build议类似,但是避免了连接,因此可以更有效率。

你可以尝试在SQL Fiddle的方法。

你可以像这样使用连接。 如果你使用IN,这将执行缓慢的尝试,以避免它。

  SELECT * FROM (SELECT msisdn, callid, Change_color, play_file_name, date_played FROM insert_log WHERE play_file_name NOT IN('Prompt1','Conclusion_Prompt_1','silent') ORDER BY callid ASC) t1 JOIN (SELECT MAX(date_played) AS date_played FROM insert_log GROUP BY callid) t2 ON t1.date_played=t2.date_played