从 table 中获取由 MAX(Column1) 过滤的所有字段
Getting all fields from table filtered by MAX(Column1)
我有 table 一些数据,例如
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(Specified) 列获取包含所有字段的行。如果我的 MAX 列很少(例如 ID 4 和 5),我必须取最后一个(ID 5)
最后结果必须是
ID Specified TIN Value
-----------------------
2 1 tin1 34
5 3 tin2 12
编辑:问题编辑后更新了查询。
这是 fiddle
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))
这将通过使用 window 函数给出期望的结果:
;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
一种方法是使用window函数,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
);
这样更好的原因是索引将用于子查询。然后索引也将用于外部查询。这是非常有效的。尽管索引将用于 window 函数;生成的执行计划可能需要扫描整个 table.
我有 table 一些数据,例如
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(Specified) 列获取包含所有字段的行。如果我的 MAX 列很少(例如 ID 4 和 5),我必须取最后一个(ID 5) 最后结果必须是
ID Specified TIN Value
-----------------------
2 1 tin1 34
5 3 tin2 12
编辑:问题编辑后更新了查询。 这是 fiddle
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))
这将通过使用 window 函数给出期望的结果:
;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
一种方法是使用window函数,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
);
这样更好的原因是索引将用于子查询。然后索引也将用于外部查询。这是非常有效的。尽管索引将用于 window 函数;生成的执行计划可能需要扫描整个 table.