我有一张这样的table:
ID Seq Prod ----------------- 1 001 1 2 002 1 3 001 2 4 002 2 5 003 2
我想做一个查询,只获取每个产品的最后一个“seq”,因此预期输出如下:
ID Seq Prod ----------------- 2 002 1 5 003 2
有什么帮助吗?
xqk2d5yq1#
一种简单的方法是关联子查询:
select t.* from t where t.seq = (select max(t2.seq) from t t2 where t2.prod = t.prod);
为了提高性能,您需要一个索引 (prod, seq) .以上往往有最好的表现。但另一种编写查询的方法是使用窗口功能:
(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;
tvz2xvvm2#
另一个选择是使用 WITH TIES ```Select top 1 * with tiesFrom YourTableOrder By row_number() over (partition by prod order by seq desc)
WITH TIES
完全披露: 戈登的回答是更有效的推动(+1),但是 `WITH TIES` 不生成额外的列。
xu3bshqb3#
您可以使用子查询来查找最大 ID 由 Prod . 在以下示例中,将“mytable”替换为表名:
ID
Prod
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
这是一把快速有效的小提琴。
ehxuflar4#
可以将相关子查询编写为:
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 )
4条答案
按热度按时间xqk2d5yq1#
一种简单的方法是关联子查询:
为了提高性能,您需要一个索引
(prod, seq)
.以上往往有最好的表现。但另一种编写查询的方法是使用窗口功能:
tvz2xvvm2#
另一个选择是使用
WITH TIES
```Select top 1 * with ties
From YourTable
Order By row_number() over (partition by prod order by seq desc)
xu3bshqb3#
您可以使用子查询来查找最大
ID
由Prod
. 在以下示例中,将“mytable”替换为表名:输出:
这是一把快速有效的小提琴。
ehxuflar4#
可以将相关子查询编写为: