T-SQL:基于 MAX 选择列(其他列)

新手上路,请多包涵

我希望有一种简单的方法可以在不使用子查询的情况下做到这一点:

场景:您有“TableA”,其中包含“Key”、“SubKey”和“Value”列。我需要获取给定“键”的 MAX(“子键”)的“值”。

因此,如果表包含行:

 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 SubKey = (subselect for max subkey)”的情况下做到这一点?

原文由 John 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 618
2 个回答

使用自联接:

这将返回所有子键值匹配的值,以防有多个值。

 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

使用顶部:

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

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

原文由 OMG Ponies 发布,翻译遵循 CC BY-SA 2.5 许可协议

可能是这样的:

 select distinct on ("Key") "Key", "Value"
from tablea
order by "Key", "SubKey" desc

原文由 Alexey Ki 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进