簡體   English   中英

僅從SQL Server數據庫表中選擇具有另一列作為最大值的行

[英]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

回復您的修改:

您編寫的查詢就像您可以獲得的一樣簡單。 如果需要縮短響應時間,應該考慮在IDIDToBeMaxed列上創建索引。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM