![](/img/trans.png)
[英]SQL selecting the rows with the maximum value in a table ordered by a column from another
[英]Select rows from a SQL Server Database table only rows that have another column as the maximum
我正在嘗試從Microsoft SQL Server數據庫表中選擇行,對於一列(ID)中的每個ID,僅選擇具有另一列作為最大值的行(IDtoBeMaxed)。 例如:
從這張桌子
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)
這是你的選擇嗎?
這是一個老派的:
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
你可以試試下面......
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
以下示例返回按IDtoBeMaxed排名的記錄
;WITH cte AS
(SELECT *, DENSE_RANK() OVER(PARTITION BY ID ORDER BY IDtoBeMaxed DESC) AS dr
FROM myTable
)
SELECT *
FROM cte
WHERE dr = 1
在SQLFiddle
演示
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.