ultimo - sql seleccionar registro mayor fecha
Seleccionando la fecha más reciente entre dos columnas (12)
AFAIK, no hay una función incorporada para obtener el máximo de dos valores, pero puede escribir los suyos fácilmente como:
CREATE FUNCTION dbo.GetMaximumDate(@date1 DATETIME, @date2 DATETIME)
RETURNS DATETIME
AS
BEGIN
IF (@date1 > @date2)
RETURN @date1
RETURN @date2
END
y llámalo como
SELECT Id, dbo.GetMaximumDate(Date1, Date2)
FROM tableName
Si tengo una tabla que (entre otras columnas) tiene dos columnas DATETIME, ¿cómo seleccionaría la fecha más reciente de esas dos columnas?
Ejemplo:
ID Date1 Date2
1 1/1/2008 2/1/2008
2 2/1/2008 1/1/2008
3 1/10/2008 1/10/2008
Si quisiera que mis resultados se vean como
ID MostRecentDate
1 2/1/2008
2 2/1/2008
3 1/10/2008
¿Hay una manera simple de hacer esto que obviamente estoy pasando por alto? Sé que puedo hacer subconsultas y declaraciones de casos o incluso escribir una función en el servidor sql para manejarlo, pero tenía en mi cabeza que había una función de tipo de comparación máxima ya incorporada de la que me olvido.
Aparte de la declaración del caso, no lo creo ...
Select Case When DateColA > DateColB Then DateColA
Else DateColB End MostRecent
From Table ...
Puede incluir esto en una función escalar, lo que simplifica el manejo de nulos. Obviamente, no va a ser más rápido que el enunciado de caso en línea.
ALTER FUNCTION [fnGetMaxDateTime] (
@dtDate1 DATETIME,
@dtDate2 DATETIME
) RETURNS DATETIME AS
BEGIN
DECLARE @dtReturn DATETIME;
-- If either are NULL, then return NULL as cannot be determined.
IF (@dtDate1 IS NULL) OR (@dtDate2 IS NULL)
SET @dtReturn = NULL;
IF (@dtDate1 > @dtDate2)
SET @dtReturn = @dtDate1;
ELSE
SET @dtReturn = @dtDate2;
RETURN @dtReturn;
END
Siempre que sea posible, use las funciones InLine ya que no sufren ninguno de los problemas de rendimiento generalmente asociados con las UDF ...
Create FUNCTION MaximumDate
(
@DateTime1 DateTime,
@DateTime2 DateTime
)
RETURNS TABLE
AS
RETURN
(
Select Case When @DateTime1 > @DateTime2 Then @DateTime1
Else @DateTime2 End MaxDate
)
GO
Para las pautas de uso, mira Aquí
select ID,
case
when Date1 > Date2 then Date1
else Date2
end as MostRecentDate
from MyTable
Todas las demás respuestas correctas ya publicadas.
Pero si aún busca la palabra clave MAX, aquí tiene una forma:
select ID , MAX(dt) from
( select Id , Date1 as dt from table1
union
select ID , Date2 from table2
) d
group by d.Id
¿Por qué no puedes usar la función MÁS GRANDE?
select id, date1, date2, GREATEST( nvl(date1,date2) , nvl(date2, date1) )
from table1;
Incluí un NVL para garantizar que NULL se evaluó correctamente; de lo contrario, si Date1 o Date2 son nulos, Greatest devuelve NULL.
ID Date1 Date2 MostRecentDate
1 1/1/2008 2/1/2008 2/1/2008
2 2/1/2008 1/1/2008 2/1/2008
3 1/10/2008 1/10/2008 1/10/2008
4 -null- 2/10/2008 2/10/2008
5 2/10/2008 -null- 2/10/2008
Creo que la respuesta aceptada es la más simple. Sin embargo, me gustaría ver valores nulos en las fechas ...
SELECT ID,
CASE WHEN ISNULL(Date1,''01-01-1753'') > ISNULL(Date2,''01-01-1753'') THEN Date1
ELSE Date2
END AS MostRecentDate
FROM Table
select max(d) ChangeDate
from (values(@d), (@d2)) as t(d)
Este hilo tiene varias soluciones. Si tenía más de 2 fechas para comparar, "unpivot" podría ser preferible a escribir una serie de declaraciones de casos. Lo siguiente es descaradamente robado de Niikola :
select id, max(dDate) MostRecentDate
from YourTable
unpivot (dDate for nDate in (Date1, Date2, Date3)) as u
group by id
Luego puede order by dDate
, si eso es útil.
CASE es en mi humilde opinión su mejor opción:
SELECT ID,
CASE WHEN Date1 > Date2 THEN Date1
ELSE Date2
END AS MostRecentDate
FROM Table
Si una de las columnas es nulable, solo tiene que adjuntar en COALESCE
:
.. COALESCE(Date1, ''1/1/1973'') > COALESCE(Date2, ''1/1/1973'')
Desde SQL Server 2012 es posible usar el acceso directo IIF
a la expresión CASE
, aunque este último es SQL Standard:
SELECT ID,
IIF(DateColA > DateColB, DateColA, DateColB) AS MostRecentDate
FROM theTable