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

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

我有一张这样的table:

  1. ID Seq Prod
  2. -----------------
  3. 1 001 1
  4. 2 002 1
  5. 3 001 2
  6. 4 002 2
  7. 5 003 2

我想做一个查询,只获取每个产品的最后一个“seq”,因此预期输出如下:

  1. ID Seq Prod
  2. -----------------
  3. 2 002 1
  4. 5 003 2

有什么帮助吗?

xqk2d5yq

xqk2d5yq1#

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

  1. select t.*
  2. from t
  3. where t.seq = (select max(t2.seq) from t t2 where t2.prod = t.prod);

为了提高性能,您需要一个索引 (prod, seq) .
以上往往有最好的表现。但另一种编写查询的方法是使用窗口功能:

  1. select t.*
  2. from (select t.*, row_number() over (partition by prod order by seq desc) as seqnum
  3. from t
  4. ) t
  5. 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. 完全披露:
  2. 戈登的回答是更有效的推动(+1),但是 `WITH TIES` 不生成额外的列。
xu3bshqb

xu3bshqb3#

您可以使用子查询来查找最大 IDProd . 在以下示例中,将“mytable”替换为表名:

  1. SELECT t.*
  2. FROM myTable t
  3. INNER JOIN (
  4. SELECT MAX(ID) AS ID,
  5. Prod
  6. FROM myTable
  7. GROUP BY Prod
  8. ) a ON a.ID = t.ID

输出:

  1. ID Seq Prod
  2. 2 002 1
  3. 5 003 2

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

展开查看全部
ehxuflar

ehxuflar4#

可以将相关子查询编写为:

  1. select T.ID,T.Seq,T.Prod
  2. from @T1 T
  3. where T.ID = (select max(T_Inner.ID)
  4. from @T1 T_Inner
  5. where T_Inner.Prod = T.Prod
  6. group by T_Inner.Prod
  7. )

相关问题