T-SQL: Seleccionar Columna Basada en MAX (Otra Columna)


Espero que haya una forma sencilla de hacer esto sin usar una sub-consulta:

Escenario: Tiene "TableA" con columnas "Clave", "Subclave" y "Valor". Necesito obtener el" Valor " del MAX ("Subclave") para una"Clave" dada.

Así que si la Tabla contenía las filas:

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

Para Key = 1, necesito el valor 300. Esperaba hacer algo como esto:

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

Pero eso es imposible. ¿Hay una manera de hacer esto sin hacer un ' WHERE SubKey = (subselect for max subclave)'?

Author: Tom H, 0000-00-00

4 answers

Usando un auto join:

Esto devolverá todos los valores con valores de subclave que coincidan, en caso de que haya múltiplos.

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

Usando RANK & CTE (SQL Server 2005+):

Esto devolverá todos los valores con valores de subclave que coincidan, en caso de que haya múltiplos.

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

Usando ROW_NUMBER & CTE (SQL Server 2005+):

Esto devolverá una fila, incluso si hay más de una con el mismo valor de subclave...

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

Usando TOP:

Esta voluntad devuelve una fila, incluso si hay más de una con el mismo valor de subclave...

  SELECT TOP 1
         t.value
    FROM TABLE t
   WHERE t.key = 1
ORDER BY t.subkey DESC
 43
Author: OMG Ponies,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-09-09 20:39:06

Muy simple, no join, no sub-query:

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

Si necesita un valor máximo para cada clave:

SELECT DISTINCT Key, 
FIRST_VALUE(Value) OVER (PARTITION BY Key ORDER BY SubKey DESC)
FROM TableA
 9
Author: Nguyen Viet Cuong,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-02-18 09:17:58
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
 4
Author: Amy B,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-09-09 20:26:24

OMG Ponis golpear la mayoría de las maneras de hacerlo. Aquí hay una más:

SELECT
    T1.value
FROM
    My
 3
Author: ,
Warning: date() expects parameter 2 to be long, string given in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61