J'ai une requête qui est vraiment lente. Je posterai du pseudo code ici.
SELECT ListofDates.Date as Event, (SELECT COUNT(DISTINCT TableofExtensiveJoins1.ID) FROM TableofExtensiveJoins1) WHERE Event=TableofExtensiveJoins1.Date AND Condition1 (SELECT COUNT(DISTINCT TableofExtensiveJoins2.ID) FROM TableofExtensiveJoins2 WHERE Event = TableofExtensiveJoins2.Date AND Condition2) (SELECT COUNT(DISTINCT TableofExtensiveJoins3.ElementID) FROM TableofExtensiveJoins3 WHERE Event = TableofExtensiveJoins3.Date AND Condition3) FROM ListOfDates
3 Réponses :
Essayez l'agrégation conditionnelle, une sorte de
Le ci-dessous doit fonctionner mieux car il n'évalue que tableOffensancljoinages code> une seule fois et n'a besoin que d'une opération pour obtenir le nombre distinct
WITH DistCounts
AS (SELECT COUNT(DISTINCT ID) AS DistCount,
condition_flag,
Date
FROM TableofExtensiveJoins
CROSS APPLY (SELECT 1 WHERE Condition1
UNION ALL
SELECT 2 WHERE Condition2
UNION ALL
SELECT 3 WHERE Condition3) CA(condition_flag)
GROUP BY condition_flag,
Date),
Pivoted
AS (SELECT Date,
MAX(CASE WHEN condition_flag = 1 THEN DistCount END) AS DistCount1,
MAX(CASE WHEN condition_flag = 2 THEN DistCount END) AS DistCount2,
MAX(CASE WHEN condition_flag = 3 THEN DistCount END) AS DistCount3
FROM DistCounts
GROUP BY Date)
SELECT lod.Date as Event,
DistCount1,
DistCount2,
DistCount3
from ListOfDates lod
left join Pivoted p on lod.Date=p.Date
Je pense que vous voulez supposant que externe s'appliquer code>:
tej.id code> est unique, vous n'avez pas besoin du Nombre (distinct) code>. Cependant, si vous faites: p>
SELECT lod.Date as Event, tej.*
From ListOfDates lod OUTER APPLY
(SELECT COUNT(DISTINCT CASE WHEN <condition 1> THEN tej.ID END) as col1,
COUNT(DISTINCT CASE WHEN <condition 2> THEN tej.ID END) as col2,
COUNT(DISTINCT CASE WHEN <condition 3> THEN tej.ID END) as col3
FROM TableofExtensiveJoins tej
WHERE lod.Event = tej.Date
) tej;
Merci. C'est un bon point de départ qu'il semble. Je n'ai qu'un seul problème. Je veux que la condition soit dépendante sur LOD. Mais les références intérieures et extérieures ne sont pas autorisées. Avez-vous une idée de la façon de contourner cela?
@ODATAS. . . Ces deux ces deux appuient cette fonctionnalité. C'est pourquoi j'ai répondu avec appliquer code>.
Mais je reçois une erreur de la fonction agrégée: "Plusieurs colonnes sont spécifiées dans une expression agrégée contenant une référence extérieure. Si une expression étant agrégée contient une référence extérieure, cette référence extérieure doit être la seule colonne référencée dans l'expression."
@ODATAS. . . C'est difficile à réparer sans voir le code - vous devriez peut-être poser une autre question. Vous devez séparer les conditions corrélation i> (ceux qui relient les tables internes et extérieures à partir des conditions Aggregation i>.
Exemple de données Les résultats souhaités vous donneraient de meilleures chances d'avoir une bonne réponse. Veuillez lire les premiers paragraphes de la info TSQL Tag et Modifier Votre question en conséquence.
Vous pouvez essayer d'utiliser la déclaration avec
Voulez-vous une solution pseudo ou une solution de travail? Veuillez fournir DDL + DML + Exemple de requête que vous souhaitez améliorer