T-SQL:根据MAX选择列(其他列)

whitzsjs  于 2022-10-03  发布在  其他
关注(0)|答案(8)|浏览(198)

我希望有一种不使用子查询的简单方法:

场景:您有一个包含“key”、“SubKey”和“Value”列的“ableA”。我需要获取给定“key”的Max(“SubKey”)的“值”。

因此,如果表中包含以下行:

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)”的情况下做到这一点?

xzv2uavs

xzv2uavs1#

使用自联接:

这将返回具有匹配的子键值的所有值,以防存在倍数。

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
6ioyuze2

6ioyuze22#

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

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
z9gpfhce

z9gpfhce3#

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
hiz5n14c

hiz5n14c4#

我的天哪,小马撞上了大多数的方式。这里还有一条:

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为空的情况是在左联接中没有匹配项时,这意味着不存在具有更高子键的行。如果有多行具有相同(最高)的子键,这将返回多行。

tsm1rwdh

tsm1rwdh5#

OMG PonieROW_NUMBER方法在所有情况下都是最有效的方法,因为它不会在具有两个相同数量的MAX值的情况下失败,返回比预期更多的记录,并破坏recordset可能提供给您的插入。

缺少的一件事是,当还存在多个键时,如何在必须返回与每个最大值相关联的子键的情况下执行此操作。只需将summary表与MINGROUP“本身”连接起来,就可以开始了。

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
xe55xuns

xe55xuns6#

如果您总是希望一个键值只有一行,而不是同时有多个键的答案,那么所有连接的东西都是无用的过度构建。只要使用OMG小马已经给你的前1个问题就行了。

lb3vh1jj

lb3vh1jj7#

如果使用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
ezykj2lf

ezykj2lf8#

可能是这样的:

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

相关问题