T-SQL:select基于MAX的列(其他列)

我希望有一个简单的方法来做到这一点,而不使用子查询:

场景:您有“TableA”列“Key”,“SubKey”和“Value”。 我需要获得给定“密钥”的MAX(“SubKey”)的“Value”。

所以如果表格包含行:

KEY SUBKEY VALUE 1 1 100 1 2 200 1 3 300 

对于Key = 1,我需要300的值。我希望做这样的事情:

 SELECT VALUE FROM TableA WHERE Key = 1 HAVING SubKey = MAX(SubKey) 

但这是一个不行。 有没有办法做到这一点,而不做'WHERE子密钥=(子select最大子密钥)“?

使用自join:

这将返回所有与匹配的子键值的值,以防万一出现倍数。

 SELECT a.value FROM TABLE a JOIN (SELECT MAX(t.subkey) AS max_subkey FROM TABLE t WHERE t.key = 1) b ON b.max_subkey = a.subkey WHERE a.key = 1 

使用RANK&CTE(SQL Server 2005+):

这将返回所有与匹配的子键值的值,以防万一出现倍数。

 WITH summary AS ( SELECT t.*, RANK() OVER(ORDER BY t.subkey DESC) AS rank FROM TABLE t WHERE t.key = 1) SELECT s.value FROM summary s WHERE s.rank = 1 

使用ROW_NUMBER&CTE(SQL Server 2005+):

这将返回一行,即使有多个具有相同的子键值…

 WITH summary AS ( SELECT t.*, ROW_NUMBER() OVER(ORDER BY t.subkey DESC) AS rank FROM TABLE t WHERE t.key = 1) SELECT s.value FROM summary s WHERE s.rank = 1 

使用TOP:

这将返回一行,即使有多个具有相同的子键值…

  SELECT TOP 1 t.value FROM TABLE t WHERE t.key = 1 ORDER BY t.subkey DESC 

非常简单,没有连接,没有子查询:

 SELECT FIRST_VALUE(Value) OVER (ORDER BY SubKey DESC) FROM TableA WHERE Key = 1 

如果您需要每个密钥的最大值:

 SELECT DISTINCT Key, FIRST_VALUE(Value) OVER (PARTITION BY Key ORDER BY SubKey DESC) FROM TableA 
 SELECT MAX(Value) FROM TableA t1 GROUP BY Key, SubKey HAVING SubKey = (SELECT MAX(SubKey) FROM TableA t2 WHERE t1.Key = t2.Key) AND Key = 1 

OMG小马打大部分的方式来做到这一点。 还有一个:

 SELECT T1.value FROM My_Table T1 LEFT OUTER JOIN My_Table T2 ON T2.key = T1.key AND T2.subkey > T1.subkey WHERE T2.key IS NULL 

唯一一次T2.key将为NULL的时候,在LEFT JOIN中没有匹配,这意味着没有行存在一个更高的子键。 如果有多个具有相同(最高)子键的行,这将返回多行。

OMG Ponie的ROW_NUMBER方法是在所有情况下都能最好地工作的方法,因为在两个MAX值相同的情况下,如果返回的logging数多于预期值,那么它将不会失败,并且会破坏可能由此提供的插入recordset

有一件事是缺less的是,如果在必须返回与每个最大值相关联的子键的情况下,如果还有多个键,则该如何执行。 只需将MINGROUP “本身”join到summary表中即可。

 WITH summary AS ( SELECT t.*, ROW_NUMBER() OVER(ORDER BY t.subkey DESC) AS rank FROM TABLE t WHERE t.key = 1) SELECT s.* FROM summary s join (select key, min(rank) as rank from summary group by key) sMAX on s.key = sMAX.key and r.rank = sMAX.rank 

如果你总是只想要一个键的值而不是一个键的答案,所有的连接的东西是无用的overbuilding。 只要使用OMG Ponies已经给你的TOP 1查询。

在使用CTE的多个密钥的情况下:

 WITH CTE AS ( SELECT key1, key2, MAX(subkey) AS MaxSubkey FROM TableA GROUP BY key1, key2 ) SELECT a.Key1, a.Key2, a.Value FROM TableA a INNER JOIN CTE ON a.key1 = CTE.key1 AND a.key2 = CTE.key2 AND a.subkey = CTE.MaxSubkey