只获取序列中的最后一行sql服务器

ht4b089n  于 2021-07-24  发布在  Java
关注(0)|答案(4)|浏览(231)

我有一张这样的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

有什么帮助吗?

xqk2d5yq

xqk2d5yq1#

一种简单的方法是关联子查询:

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;
tvz2xvvm

tvz2xvvm2#

另一个选择是使用 WITH TIES ```
Select top 1 * with ties
From YourTable
Order By row_number() over (partition by prod order by seq desc)

完全披露:
戈登的回答是更有效的推动(+1),但是 `WITH TIES` 不生成额外的列。
xu3bshqb

xu3bshqb3#

您可以使用子查询来查找最大 IDProd . 在以下示例中,将“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

这是一把快速有效的小提琴。

ehxuflar

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 
            )

相关问题