Parece que deve ser fácil. Como obtenho as datas mais recentes em colunas diferentes
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
Eu gostaria que o resultado fosse:
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
fonte
fonte
NULL
.MAX
usar o usoGROUP BY
. Portanto, minha resposta para sua pergunta é "não será corrigida", porque acho que talvez o design do seu banco de dados precise mudar.call_case
) e um carimbo de data / hora. Nem uma única tabela com 50 colunasA resposta atualmente aceita é a melhor resposta, mas não acho que seja suficiente explicar o porquê. As outras respostas certamente parecem muito mais limpas à primeira vista (quem quer escrever essa declaração feia de caso), mas provavelmente serão muito piores quando você começar a operar em escala.
Aqui está como eu configuro tudo
No meu sistema, isso gera 12.872.738 linhas na tabela. Se eu tentar cada uma das consultas acima (ajustada para
SELECT INTO
que eu não precise esperar que ela termine de imprimir os resultados no SSMS), recebo os seguintes resultados:Se você olhar para os planos de consulta, torna-se bastante óbvio o motivo: ao adicionar qualquer tipo de dinâmica não agregada ou agregada (ou proibida
STRING_SPLIT
), você terminará com todos os tipos de operadores adicionais dos quais não precisa (e força o plano a paralelamente, retirando recursos que outras consultas podem querer). Por contrato, aCASE
solução baseada não é paralela, é executada muito rapidamente e é incrivelmente simples.Nesse caso, a menos que você tenha recursos ilimitados (não possui), escolha a abordagem mais simples e rápida.
Havia uma pergunta sobre o que fazer se você precisar continuar adicionando novas colunas e expandindo a instrução de caso. Sim, isso fica pesado, mas o mesmo acontece com qualquer outra solução. Se esse é realmente um fluxo de trabalho plausível, você deve redesenhar sua tabela. O que você deseja provavelmente se parece com isso:
Isso certamente não está livre de possíveis problemas de desempenho e exigirá um ajuste cuidadoso do índice, mas é a melhor maneira de lidar com um número arbitrário de possíveis carimbos de data / hora
Caso alguma resposta seja excluída, aqui estão as versões que eu estava comparando (em ordem)
fonte
Tente o seguinte:
fonte
NULL
s, deve ter bom desempenho e generaliza facilmente para mais colunas.SQL FIDDLE
Usar
MAX()
Usar
CASE
fonte
VALUES
é muito mais escalável do que umaCASE
expressão grande . Eu também gostaria de saber por que a votação foi reduzida, pois o eleitor parece acreditar que há um problema com o SQL e, portanto, se eles nos disserem esse problema, todos nós podemos aprender com ele.Na minha opinião, o Pivot é a opção melhor e eficiente para esta consulta. Copie e cole no MS SQL SERVER. Por favor, verifique o código escrito abaixo:
fonte
Isso realmente deve ser reavaliado no nível do design, como outros indicaram. Abaixo está um exemplo de um design diferente usando duas tabelas para realizar melhor o que parece que você está procurando em seus resultados. Isso tornará o crescimento muito mais favorável.
Aqui está um exemplo (nomes de tabela diferentes usados):
Isso permite que mais tipos de casos sejam adicionados, muito mais entradas de log a serem adicionadas e fornece um design melhor.
Este é apenas um exemplo para fins de aprendizado.
fonte