Il semble que cela devrait être facile. Comment obtenir les dernières dates qui se trouvent dans différentes colonnes
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
J'aimerais que le résultat soit:
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
la source
la source
NULL
.MAX
utilisationGROUP BY
. Donc, ma réponse à votre question est «ne résoudra pas», car je pense que la conception de votre base de données doit peut-être changer.call_case
) et un horodatage. Pas une seule table avec 50 colonnesLa réponse actuellement acceptée est la meilleure réponse, mais je ne pense pas qu'elle explique assez bien pourquoi. Les autres réponses semblent certainement beaucoup plus propres en un coup d'œil (qui veut écrire cette déclaration de cas laide), mais sont susceptibles d'être bien pires lorsque vous commencez à opérer à grande échelle.
Voici comment j'ai tout mis en place
Sur mon système, cela me donne 12 872 738 lignes dans le tableau. Si j'essaye chacune des requêtes ci-dessus (peaufinée pour
SELECT INTO
ne pas avoir à attendre qu'elle termine l'impression des résultats dans SSMS), j'obtiens les résultats suivants:Si vous regardez les plans de requête, il devient assez évident pourquoi - en ajoutant tout type de pivot ou d'agrégat (ou le ciel ne plaise
STRING_SPLIT
), vous vous retrouverez avec toutes sortes d'opérateurs supplémentaires dont vous n'avez pas besoin (et cela force le plan à aller en parallèle, en supprimant les ressources que d'autres requêtes pourraient souhaiter). Par contrat, laCASE
solution basée ne va pas en parallèle, fonctionne très rapidement et est incroyablement simple.Dans ce cas, à moins que vous n'ayez des ressources illimitées (vous n'en avez pas), vous devez choisir l'approche la plus simple et la plus rapide.
Il y avait une question de quoi faire si vous devez continuer à ajouter de nouvelles colonnes et à développer l'instruction case. Oui, cela devient compliqué, mais il en va de même pour toutes les autres solutions. S'il s'agit en fait d'un flux de travail plausible, vous devez reconcevoir votre table. Ce que vous voulez ressemble probablement à ceci:
Ce n'est certainement pas exempt de problèmes de performances potentiels, et nécessitera un réglage minutieux de l'index, mais c'est le meilleur moyen de gérer un nombre arbitraire d'horodatages potentiels
Dans le cas où des réponses seraient supprimées, voici les versions que je comparais (dans l'ordre)
la source
Essaye ça:
la source
NULL
s, doit avoir de bonnes performances et se généralise facilement à plus de colonnes.SQL FIDDLE
Utilisation
MAX()
Utilisation
CASE
la source
VALUES
est beaucoup plus évolutive qu'une grandeCASE
expression. Je voudrais moi aussi savoir pourquoi il a été rétrogradé, car l'électeur semble croire qu'il y a un problème avec le SQL, et donc s'il nous dit ce problème, nous pouvons tous en tirer des leçons.À mon avis, Pivot est l'option la meilleure et la plus efficace pour cette requête. Copiez et collez dans le SERVEUR MS SQL. Veuillez vérifier le code écrit ci-dessous:
la source
Cela devrait vraiment être réévalué au niveau de la conception, comme d'autres l'ont indiqué. Vous trouverez ci-dessous un exemple de conception différente utilisant deux tableaux pour mieux accomplir ce que vous recherchez dans vos résultats. Cela rendra la croissance beaucoup plus favorable.
Voici un exemple (différents noms de table utilisés):
Cela permet d'ajouter plus de types de cas, d'ajouter beaucoup plus d'entrées de journal et offre une meilleure conception.
Ceci est juste un exemple à des fins d'apprentissage.
la source