Comment renvoyez-vous 1 valeur par ligne du maximum de plusieurs colonnes:
Nom de la table
[Number, Date1, Date2, Date3, Cost]
Je dois retourner quelque chose comme ça:
[Number, Most_Recent_Date, Cost]
Requete?
sql
sql-server
tsql
Ben B
la source
la source
WHEN Date1 > Date2 AND Date1 > Date3 THEN Date1; WHEN Date2 > Date3 THEN Date3; ELSE Date3
?Voici une autre belle solution pour la
Max
fonctionnalité utilisant T-SQL et SQL Serverla source
Si vous utilisez MySQL, vous pouvez utiliser
la source
Il y a 3 autres méthodes où
UNPIVOT
(1) est de loin le plus rapide, suivi de Simulated Unpivot (3) qui est beaucoup plus lent que (1) mais toujours plus rapide que (2)Solution 1 (
UNPIVOT
)Solution 2 (sous-requête par ligne)
Solution 3 (simulée
UNPIVOT
)la source
L'un des deux exemples ci-dessous fonctionnera:
Le second est un complément à la réponse de Lassevk .
la source
Pour T-SQL (MSSQL 2008+)
la source
la source
La fonction scalaire provoque toutes sortes de problèmes de performances, il est donc préférable d'envelopper la logique dans une fonction à valeur de table en ligne si possible. C'est la fonction que j'ai utilisée pour remplacer certaines fonctions définies par l'utilisateur qui sélectionnaient les dates Min / Max dans une liste de jusqu'à dix dates. Lorsqu'elle a été testée sur mon ensemble de données de 1 million de lignes, la fonction scalaire a pris plus de 15 minutes avant de tuer la requête. Le TVF en ligne a pris 1 minute, ce qui équivaut à la sélection de l'ensemble de résultats dans une table temporaire. Pour utiliser cet appel, la fonction à partir d'une sous-requête dans le SELECT ou un CROSS APPLY.
la source
Ceci est légèrement plus facile à écrire et ignore les étapes d'évaluation car l'instruction de cas est évaluée dans l'ordre.
la source
Malheureusement, la réponse de Lasse , bien qu'apparemment évidente, a un défaut crucial. Il ne peut pas gérer les valeurs NULL. Toute valeur NULL unique entraîne le renvoi de Date1. Malheureusement, toute tentative de résoudre ce problème a tendance à devenir extrêmement compliquée et ne se transforme pas très bien en 4 valeurs ou plus.
La première réponse de databyss semblait (et est) bonne. Cependant, il n'était pas clair si la réponse serait facilement extrapolable à 3 valeurs à partir d'une jointure multi-table au lieu des 3 valeurs plus simples d'une table unique. Je voulais éviter de transformer une telle requête en sous-requête juste pour obtenir le maximum de 3 colonnes, j'étais également sûr que l'excellente idée de databyss pouvait être nettoyée un peu.
Alors sans plus tarder, voici ma solution (dérivée de l'idée de databyss).
Il utilise des constantes de sélection de jointures croisées pour simuler l'effet d'une jointure multi-tables. La chose importante à noter est que tous les alias nécessaires s'exécutent correctement (ce qui n'est pas toujours le cas) et cela maintient le modèle assez simple et assez évolutif à travers des colonnes supplémentaires.
la source
Problème: choisissez la valeur de taux minimum donnée à une entité Exigences: Les taux d'agence peuvent être nuls
Inspiré par cette réponse de Nat
la source
Si vous utilisez SQL Server 2005, vous pouvez utiliser la fonctionnalité UNPIVOT. Voici un exemple complet:
la source
Utilisation de CROSS APPLY (pour 2005+) ....
la source
À partir de SQL Server 2012, nous pouvons utiliser IIF .
la source
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
Veuillez essayer d'utiliser
UNPIVOT
:la source
Je préfère les solutions basées sur le cas où, mon hypothèse est que cela devrait avoir le moins d'impact sur la baisse de performance possible par rapport à d'autres solutions possibles comme celles avec application croisée, valeurs (), fonctions personnalisées, etc.
Voici la version au cas où qui gère les valeurs nulles avec la plupart des cas de test possibles:
et le résultat est:
la source
Vous pouvez créer une fonction où vous passez les dates, puis ajouter la fonction à l'instruction select comme ci-dessous. sélectionnez Number, dbo.fxMost_Recent_Date (Date1, Date2, Date3), Cost
(@ Date1 smalldatetime, @ Date2 smalldatetime, @ Date3 smalldatetime) RETOURNE smalldatetime COMME COMMENCER DECLARE @Result smalldatetime
FIN
la source
Basé sur la solution ScottPletcher de http://www.experts-exchange.com/Microsoft/Development/MS-SQL-Server/Q_24204894.html, j'ai créé un ensemble de fonctions (par exemple GetMaxOfDates3, GetMaxOfDates13) pour trouver max jusqu'à 13 valeurs de date en utilisant UNION ALL. Voir la fonction T-SQL pour obtenir le maximum de valeurs de la même ligne. Cependant, je n'ai pas envisagé la solution UNPIVOT au moment d'écrire ces fonctions
la source
Une autre façon d'utiliser CASE WHEN
la source
Le tableau ci-dessus est un tableau des salaires des employés avec salaire1, salaire2, salaire3, salaire4 sous forme de colonnes.La requête ci-dessous renverra la valeur maximale sur quatre colonnes
L'exécution de la requête ci-dessus donnera la sortie comme la plus grande_val (10001)
La logique de la requête ci-dessus est la suivante:
la sortie sera 10001
la source
voici une bonne solution:
la source
Je ne sais pas si c'est sur SQL, etc ... sur l'aide M $ ACCESS il y a une fonction appelée
MAXA(Value1;Value2;...)
qui est censée faire ça.L'espoir peut aider quelqu'un.
PD: Les valeurs peuvent être des colonnes ou des valeurs calculées, etc.
la source
MAXA
est une fonction Excel , pas Access.