Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
仅从序列中的最后一行获取数据。SQL Server_Sql_Sql Server - Fatal编程技术网

仅从序列中的最后一行获取数据。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 
            )