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的是,如果在必须返回与每个最大值相关联的子键的情况下,如果还有多个键,则该如何执行。 只需将MIN
和GROUP
“本身”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