从SQL Server数据库表中选择行,仅选择最大值为另一列的行
我正在尝试从Microsoft SQL Server数据库表中选择行,该表针对一列(ID)中的每个ID,仅选择另一列为最大值(IDTOBEMAX)的行。例如: 从这张桌子上从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 我只想要
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的行。