我有一些数据表,例如
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
答案 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 id
和id
上有索引,则最有效的方法是:
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
);
更好的原因是索引将用于子查询。然后索引也将用于外部查询。这非常有效。虽然索引将用于窗口函数;生成的执行计划可能需要扫描整个表。