Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.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_Select - Fatal编程技术网

从SQL Server数据库表中选择行,仅选择最大值为另一列的行

从SQL Server数据库表中选择行,仅选择最大值为另一列的行,sql,sql-server,select,Sql,Sql Server,Select,我正在尝试从Microsoft SQL Server数据库表中选择行,该表针对一列(ID)中的每个ID,仅选择另一列为最大值(IDTOBEMAX)的行。例如: 从这张桌子上 ID SomeValue IDtoBeMaxed 1 56 2 1 59 2 1 80 1 2 55 5 2 80 5 2 56 3 2 81 3 我只想要

我正在尝试从Microsoft SQL Server数据库表中选择行,该表针对一列(ID)中的每个ID,仅选择另一列为最大值(IDTOBEMAX)的行。例如:

从这张桌子上

  ID  SomeValue IDtoBeMaxed
  1   56        2  
  1   59        2  
  1   80        1
  2   55        5
  2   80        5
  2   56        3
  2   81        3
我只想要

  ID  SomeValue IDtoBeMaxed
  1   56        2  
  1   59        2  
  2   55        5
  2   80        5
我有这个查询,它可以工作,但是我认为应该有一个更快的方法来减少查询的响应时间。同样,这个查询提供了我想要的,我正在寻找一个更快的响应时间查询

SELECT * 
FROM myTable 
WHERE ID = 2 
  AND IDtoBeMaxed = (SELECT MAX(IDtoBeMaxed) FROM myTable WHERE ID = 2)
编辑:我不需要所有的行,正如我在上面的示例中所示。我只需要特定ID的行,就像我自己编写的查询一样


结果:我尝试了Shavkat查询,但它并不比我编写的查询快。其余的答案返回了我没有查找的所有行。因此,这仍然有待讨论。但谢谢你迄今为止的回答

是否尝试在一个查询中返回表中的所有行?类似于以下内容的操作将起作用:

SELECT t.Id,t.SomeValue,t.IDtoBeMaxed
FROM MyTable t
JOIN (
    SELECT Id,MAX(IDToBeMaxed) AS MaxId
    FROM MyTable
    GROUP BY Id
) AS m ON t.Id=m.Id AND t.IDToBeMaxed=m.MaxId
针对您的编辑:

您编写的查询非常简单。如果需要提高响应时间,您应该考虑在
ID
IDToBeMaxed
列上创建索引

CREATE INDEX ix_IDMaxed ON MyTable(ID,IDToBeMaxed)

这是您的选择吗?

请您在下面试试……

WITH    selectOne
          AS ( SELECT   ROW_NUMBER() OVER ( PARTITION BY SomeValue, ID ORDER BY IDtoBeMaxed DESC ) AS RowNum ,
                        ID ,
                        SomeValue ,
                        IDtoBeMaxed
               FROM     myTable
             )
    SELECT  *
    FROM    selectOne
    WHERE   RowNum = 1

这是一个老式的:

declare @myTable table (ID int,  SomeValue int, IDtoBeMaxed int)
insert into @myTable
values
  (1,   56,        2 ), 
  (1,   59,        2 ),  
  (1,   80,        1 ),
  (2,   55,        5 ),
  (2,   80,        5 ),
  (2,   56,        3 ),
  (2,   81,        3 ),
  (3,   55,        5 ),
  (3,   80,        5 ),
  (3,   56,        5 ),
  (3,   81,        5 )

select a.*
from @myTable a left join @myTable b 
on a.ID = b.ID and a.IDtoBeMaxed < b.IDtoBeMaxed
where b.ID is null and a.ID = 2
declare@myTable表(ID int、SomeValue int、IDtoBeMaxed int)
插入@myTable
价值观
(1,   56,        2 ), 
(1,   59,        2 ),  
(1,   80,        1 ),
(2,   55,        5 ),
(2,   80,        5 ),
(2,   56,        3 ),
(2,   81,        3 ),
(3,   55,        5 ),
(3,   80,        5 ),
(3,   56,        5 ),
(3,   81,        5 )
选择a*
从@myTable a左连接@myTable b
在a.ID=b.ID和a.idtobemax
下面的示例返回按ID排序的记录

;WITH cte AS
 (SELECT *, DENSE_RANK() OVER(PARTITION BY ID ORDER BY IDtoBeMaxed DESC) AS dr
  FROM myTable
  )
  SELECT *
  FROM cte
  WHERE dr = 1

演示

我必须试着看看这是否更快。我会让你知道的。谢谢。只要数据是这样的,这个查询就很好。如果添加一行,它将无法正常工作。INSERT-INTO-mytable-VALUES(3,54,6)看看这里@user3083310您发布的sqlfiddle对我来说似乎做了正确的事情:返回每个ID具有最大IDToBeMaxed的行(ID=3:IDToBeMaxed=6,ID=2:IDToBeMaxed=5,ID=1:IDToBeMaxed=2)。但是Dogahe并不需要所有的行(参见他对问题的编辑),因此我的查询并不完全是他需要的。您编写的查询不会返回您想要的值。你确定这是对的吗?查询永远不会返回ID为1的行。