我的表看起来像这样:
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
- 不需要现金只是证明该表中有更多信息
我想得到每个唯一的组,其中日期是最大值,检查大于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
问题虽然它给了我所有的日期和检查,而不仅仅是最大日期行。
使用ms sql server 2005
答案 0 :(得分:102)
SELECT group,MAX(date) as max_date
FROM table
WHERE checks>0
GROUP BY group
这样可以获得最大日期..将其加回到您的数据中以获取其他列:
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
内部联接用作过滤器以仅获取最大记录。
仅供参考,你的列名很可怕,不要为列(组,日期,表格)使用保留字。
答案 1 :(得分:26)
你可以像这样使用window MAX():
SELECT
*,
max_date = MAX(date) OVER (PARTITION BY group)
FROM table
获取每group
个最多日期以及其他数据:
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
;
获得理想的结果。
基本上,这类似于@Twelfth's suggestion,但避免了连接,因此可能更有效。
您可以尝试at SQL Fiddle方法。
答案 2 :(得分:1)
你可以像这样使用join。如果您使用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
答案 3 :(得分:0)
SELECT distinct
group,
max_date = MAX(date) OVER (PARTITION BY group), checks
FROM table
应该工作。
答案 4 :(得分:-1)
SELECT group, date, checks
FROM table
WHERE checks > 0
GROUP BY group HAVING date = max(date)
应该工作。