从表中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