仅从序列中的最后一行获取数据。SQL Server
我有一张这样的桌子:仅从序列中的最后一行获取数据。SQL Server,sql,sql-server,Sql,Sql Server,我有一张这样的桌子: ID Seq Prod ----------------- 1 001 1 2 002 1 3 001 2 4 002 2 5 003 2 ID Seq Prod ----------------- 2 002 1 5 003 2 我想做一个查询,只获取每个产品的最后一个“Seq”,因此预期输出如下: ID Seq Prod
ID Seq Prod
-----------------
1 001 1
2 002 1
3 001 2
4 002 2
5 003 2
ID Seq Prod
-----------------
2 002 1
5 003 2
我想做一个查询,只获取每个产品的最后一个“Seq”,因此预期输出如下:
ID Seq Prod
-----------------
1 001 1
2 002 1
3 001 2
4 002 2
5 003 2
ID Seq Prod
-----------------
2 002 1
5 003 2
有什么帮助吗?一个简单的方法是关联子查询:
select t.*
from t
where t.seq = (select max(t2.seq) from t t2 where t2.prod = t.prod);
对于性能,您需要在(prod,seq)
上建立索引
以上各项通常具有最佳性能。但另一种编写查询的方法是使用窗口功能:
select t.*
from (select t.*, row_number() over (partition by prod order by seq desc) as seqnum
from t
) t
where seqnum = 1;
您可以使用子查询,通过
Prod
查找最大ID
。在以下示例中,将“myTable”替换为表名:
SELECT t.*
FROM myTable t
INNER JOIN (
SELECT MAX(ID) AS ID,
Prod
FROM myTable
GROUP BY Prod
) a ON a.ID = t.ID
输出:
ID Seq Prod
2 002 1
5 003 2
这是一个快速有效的方法。另一个选择是使用带领带的
Select top 1 * with ties
From YourTable
Order By row_number() over (partition by prod order by seq desc)
全面披露:
Gordon的答案是一个性能更高的微调(+1),但是使用TIES的
不会生成额外的列。您可以将相关子查询编写为:
select T.ID,T.Seq,T.Prod
from @T1 T
where T.ID = (select max(T_Inner.ID)
from @T1 T_Inner
where T_Inner.Prod = T.Prod
group by T_Inner.Prod
)