Parece que debería ser fácil. ¿Cómo obtengo las últimas fechas que están en diferentes columnas?
DROP TABLE #indebtedness
CREATE TABLE #indebtedness (call_case CHAR(10), date1 DATETIME, date2 DATETIME, date3 DATETIME)
INSERT #indebtedness VALUES ('Key1', '2019-10-30', '2019-11-30', '2019-10-25')
INSERT #indebtedness VALUES ('Key2', '2019-10-20', '2019-10-30', '2019-10-15')
INSERT #indebtedness VALUES ('Key3', '2019-11-11', '2019-10-29', '2019-10-30')
INSERT #indebtedness VALUES ('Key4', null , '2019-10-29', '2019-10-13')
select call_case, ?? AS 'Latest Date' from #indebtedness
Me gustaría que el resultado sea:
call_case Latest Date
Key1 2019-11-30
Key2 2019-10-30
Key3 2019-11-11
Key4 2019-10-29
sql
sql-server
datetime
Ahmed Alkhteeb
fuente
fuente
NULL
.MAX
usoGROUP BY
. Entonces, mi respuesta a su pregunta es "no se solucionará", porque creo que quizás el diseño de su base de datos deba cambiar.call_case
) y una marca de tiempo. No hay una sola mesa con 50 columnasLa respuesta actualmente aceptada es la mejor respuesta, pero no creo que explique por qué. Las otras respuestas ciertamente parecen mucho más limpias de un vistazo (quién quiere escribir esa fea declaración de caso), pero es probable que sean mucho peores cuando comience a operar a escala.
Así es como configuro todo
En mi sistema, esto me da 12,872,738 filas en la tabla. Si intento cada una de las consultas anteriores (ajustada para
SELECT INTO
no tener que esperar a que termine de imprimir los resultados en SSMS), obtengo los siguientes resultados:Si nos fijamos en los planes de consulta, resulta bastante obvio por qué: al agregar cualquier tipo de elemento no dinámico o agregado (o Dios no lo quiera
STRING_SPLIT
), terminará con todo tipo de operadores adicionales que no necesita (y obliga al plan a ir en paralelo, quitando recursos que otras consultas podrían desear). Por contrato, laCASE
solución basada no es paralela, se ejecuta muy rápidamente y es increíblemente simple.En este caso, a menos que tenga recursos ilimitados (no los tiene), debe elegir el enfoque más simple y rápido.
Hubo una pregunta sobre qué hacer si necesita seguir agregando nuevas columnas y expandir la declaración del caso. Sí, esto se vuelve difícil de manejar, pero también lo hace cualquier otra solución. Si este es realmente un flujo de trabajo plausible, entonces debe rediseñar su tabla. Lo que quieres probablemente se parece a esto:
Ciertamente, esto no está exento de posibles problemas de rendimiento y requerirá un ajuste cuidadoso del índice, pero es la mejor manera de manejar un número arbitrario de marcas de tiempo potenciales
En caso de que se eliminen las respuestas, aquí están las versiones que estaba comparando (en orden)
fuente
Prueba esto:
fuente
NULL
s, debe tener un buen rendimiento y se generaliza fácilmente a más columnas.FIDDLE SQL
Utilizar
MAX()
Utilizar
CASE
fuente
VALUES
es mucho más escalable que unaCASE
expresión grande . A mí también me gustaría saber por qué se votó en contra, ya que el votante parece creer que hay un problema con el SQL y, por lo tanto, si nos dicen ese problema, todos podemos aprender de él.En mi opinión, Pivot es la mejor y más eficiente opción para esta consulta. Copie y pegue en el servidor MS SQL. Por favor revise el código escrito a continuación:
fuente
Esto realmente debería ser reevaluado a nivel de diseño como lo han indicado otros. A continuación se muestra un ejemplo de un diseño diferente que utiliza dos tablas para lograr mejor lo que parece que está buscando en sus resultados. Esto hará que el crecimiento sea mucho más favorable.
Aquí hay un ejemplo (se usan diferentes nombres de tabla):
Esto permite agregar más tipos de casos, agregar muchas más entradas de registro y proporciona un mejor diseño.
Este es solo un ejemplo para fines de aprendizaje.
fuente