从MAX中过滤表中的所有字段(Column1)

时间:2015-10-17 09:59:56

标签: sql sql-server max

我有一些数据表,例如

ID Specified TIN Value
----------------------
1       0   tin1   45
2       1   tin1   34
3       0   tin2   23
4       3   tin2   47
5       3   tin2   12

我需要通过MAX(指定)列获取包含所有字段的行。如果我有几行MAX列(例如ID 4和5),我必须使用最后一行(ID为5) 最后结果必须是

ID Specified TIN Value
-----------------------    
2       1   tin1   34
5       3   tin2   12

3 个答案:

答案 0 :(得分:0)

编辑:问题编辑后更新的查询。 这是小提琴

http://sqlfiddle.com/#!9/20e1b/1/0

 SELECT * FROM TBL WHERE ID IN (
 SELECT max(id)  FROM 
 TBL WHERE SPECIFIED IN 
    (SELECT MAX(SPECIFIED) FROM TBL
     GROUP BY TIN)
 group by specified)

我相信我们可以进一步简化它,但这会奏效。

select * from tbl where id =(
SELECT MAX(ID) FROM 
tbl where specified =(SELECT MAX(SPECIFIED) FROM tbl))

答案 1 :(得分:0)

这将使用窗口函数提供所需的结果:

;with cte as(select *, row_number(partition by tin order by specified desc, id desc) as rn
             from tablename)
select * from cte where rn = 1

答案 2 :(得分:0)

一种方法是使用窗函数row_number()

select t.*
from (select t.*, row_number() over (partition by tim
                                     order by specified desc, id desc
                                    ) as seqnum
      from t
     ) t
where seqnum = 1;

但是,如果您在tin, specified idid上有索引,则最有效的方法是:

select t.*
from t
where t.id = (select top 1 t2.id
              from t t2
              where t2.tin = t.tin 
              order by t2.specified desc, id desc
             );

更好的原因是索引将用于子查询。然后索引也将用于外部查询。这非常有效。虽然索引将用于窗口函数;生成的执行计划可能需要扫描整个表。