2013-10-17 33 views
25

我的表看起来是这样的:从表格中选择信息,其中行有最大日期

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 

- 不需要现金只是证明表有

我想获得它的详细信息每一个独特的群体,其中日期是max和检查是大于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

可能重复http://stackoverflow.com/questions/612231/how-can-i-select-rows-with-maxcolumn-value-distinct-by-another-column-in-sql?rq= 1 – Tom

+1

避免使用像“组”这样的特殊字词作为列... –

+0

可能的重复[SQL Server:只选择具有MAX(日期)的行](https://stackoverflow.com/questions/7118170/sql-server- select-only-rows-with-maxdate) – feetwet

回答

64
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 

内连接功能的过滤器仅获得最大记录。仅供参考,您的列名是可怕的,不要对列(组,日期,表格)使用保留字。

+3

+几个传播好业力。 – paqogomez

+3

好的和简单的答案.. – bot

+1

错误在选择组,max_date,检查列名称是“检查”。让我感到困惑一些检查在这里做什么。 –

18

可以使用​​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

+0

谢谢你的代码,100%工作:) –

0

您可以使用像这样的连接。如果你使用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 
相关问题