¿Cómo devuelve 1 valor por fila del máximo de varias columnas:
Nombre de la tabla
[Number, Date1, Date2, Date3, Cost]
Necesito devolver algo como esto:
[Number, Most_Recent_Date, Cost]
¿Consulta?
sql
sql-server
tsql
Ben B
fuente
fuente
WHEN Date1 > Date2 AND Date1 > Date3 THEN Date1; WHEN Date2 > Date3 THEN Date3; ELSE Date3
?Aquí hay otra buena solución para la
Max
funcionalidad usando T-SQL y SQL Serverfuente
Si está usando MySQL, puede usar
fuente
Hay 3 métodos más donde
UNPIVOT
(1) es el más rápido, seguido por Unpivot simulado (3) que es mucho más lento que (1) pero aún más rápido que (2)Solución 1 (
UNPIVOT
)Solución 2 (Subconsulta por fila)
Solución 3 (simulada
UNPIVOT
)fuente
Cualquiera de las dos muestras a continuación funcionará:
El segundo es un complemento de la respuesta de lassevk .
fuente
Para T-SQL (MSSQL 2008+)
fuente
fuente
La función escalar causa todo tipo de problemas de rendimiento, por lo que es mejor incluir la lógica en una función con valor de tabla en línea si es posible. Esta es la función que utilicé para reemplazar algunas funciones definidas por el usuario que seleccionaron las fechas mín. / Máx. De una lista de hasta diez fechas. Cuando se probó en mi conjunto de datos de 1 millón de filas, la función escalar tardó más de 15 minutos antes de finalizar la consulta, el TVF en línea tardó 1 minuto, que es la misma cantidad de tiempo que seleccionar el conjunto de resultados en una tabla temporal. Para utilizar esta función, llame a la función desde una subconsulta en SELECT o CROSS APPLY.
fuente
Esto es un poco más fácil de escribir y omite los pasos de evaluación ya que la declaración del caso se evalúa en orden.
fuente
Lamentablemente la respuesta de Lasse , aunque aparentemente obvia, tiene un defecto crucial. No puede manejar valores NULL. Cualquier valor NULL único hace que se devuelva Date1. Desafortunadamente, cualquier intento de solucionar ese problema tiende a ser extremadamente desordenado y no se escala muy bien a 4 o más valores.
primera respuesta de databyss parecía (y es) buena. Sin embargo, no estaba claro si la respuesta se extrapolaría fácilmente a 3 valores de una combinación de varias tablas en lugar de los 3 valores más simples de una sola tabla. Quería evitar convertir esa consulta en una subconsulta solo para obtener el máximo de 3 columnas, también estaba bastante seguro de que la excelente idea de databyss podría limpiarse un poco.
Entonces, sin más preámbulos, aquí está mi solución (derivada de la idea de databyss).
Utiliza constantes de selección de combinaciones cruzadas para simular el efecto de una combinación de varias tablas. Lo importante a tener en cuenta es que todos los alias necesarios se llevan a cabo correctamente (que no siempre es el caso) y esto mantiene el patrón bastante simple y bastante escalable a través de columnas adicionales.
fuente
Problema: elija el valor de tasa mínimo dado a una entidad Requisitos: las tasas de agencia pueden ser nulas
Inspirado por esta respuesta de Nat
fuente
Si está utilizando SQL Server 2005, puede usar la función UNPIVOT. Aquí hay un ejemplo completo:
fuente
Usando CROSS APPLY (para 2005+) ....
fuente
Desde SQL Server 2012 podemos usar IIF .
fuente
DECLARE @Date1 DATE='2014-08-01'; DECLARE @Date2 DATE=null; DECLARE @Date3 DATE='2014-07-05'; /*this gets returned*/
select IIF(@Date1 > @Date2 or @Date2 is null, IIF(@Date1 > @Date3 or @Date3 is null, @Date1, @Date3), IIF(@Date2 > @Date3 or @Date3 is null, @Date2, @Date3)) as MostRecentDate
Intenta usar
UNPIVOT
:fuente
Prefiero soluciones basadas en casos, cuando supongo que debería tener el menor impacto en la posible caída del rendimiento en comparación con otras posibles soluciones como aquellas con aplicación cruzada, valores (), funciones personalizadas, etc.
Aquí está la versión de caso en que maneja valores nulos con la mayoría de los casos de prueba posibles:
y el resultado es:
fuente
Puede crear una función donde pase las fechas y luego agregar la función a la declaración de selección como se muestra a continuación. seleccione Número, dbo.fxMost_Recent_Date (Fecha1, Fecha2, Fecha3), Costo
(@ Date1 smalldatetime, @ Date2 smalldatetime, @ Date3 smalldatetime) DEVOLUCION smalldatetime COMO COMIENZA DECLARAR @Resultar smalldatetime
FINAL
fuente
Basado en la solución de ScottPletcher de http://www.experts-exchange.com/Microsoft/Development/MS-SQL-Server/Q_24204894.html He creado un conjunto de funciones (por ejemplo, GetMaxOfDates3, GetMaxOfDates13) para encontrar max de hasta 13 valores de fecha usando UNION ALL. Consulte la función T-SQL para obtener el máximo de valores de la misma fila. Sin embargo, no he considerado la solución UNPIVOT al momento de escribir estas funciones
fuente
Otra forma de usar CASO CUANDO
fuente
La tabla de arriba es una tabla de salarios de empleados con salario1, salario2, salario3, salario4 como columnas. La consulta a continuación devolverá el valor máximo de cuatro columnas
La ejecución de la consulta anterior dará como resultado el mayor_val (10001)
La lógica de la consulta anterior es la siguiente:
la salida será 10001
fuente
Aquí hay una buena solución:
fuente
No sé si está en SQL, etc ... en la ayuda de M $ ACCESS hay una función llamada
MAXA(Value1;Value2;...)
que se supone que debe hacer eso.La esperanza puede ayudar a alguien.
PD: Los valores pueden ser columnas o calculados, etc.
fuente
MAXA
es una función de Excel , no Access.