Est-ce que SQL Server compact prend en charge les fonctions fenêtrées?
Alternative 1 - Inclut toutes les lignes qui se nouent. Comprendra pas de ligne, si les seules lignes pour un fil donné ont tous null pour HitCount:
SELECT Thread, Function, HitCount
FROM (SELECT Thread, Function, HitCount,
MAX(HitCount) over (PARTITION BY Thread) as MaxHitCount
FROM Samples
WHERE FunctionId NOT IN
(SELECT CalleeId FROM Callers)) t
WHERE HitCount = MaxHitCount
ORDER BY ThreadId, HitCount DESC
Alternative 2 - comprendra toutes les lignes qui lient. S'il n'y a pas de ligne pour un fil donné avec HitCount non nul, retournera toutes les lignes pour ce thread:
SELECT Thread, Function, HitCount
FROM (SELECT Thread, Function, HitCount,
RANK() over (PARTITION BY Thread ORDER BY HitCount DESC) as R
FROM Samples
WHERE FunctionId NOT IN
(SELECT CalleeId FROM Callers)) t
WHERE R = 1
ORDER BY ThreadId, HitCount DESC
Alternative 3 - Est-ce que non-determistically choisir une ligne en cas de liens et jeter les autres. Comprendra une ligne si toutes les lignes pour un fil donné ont HitCount null
SELECT Thread, Function, HitCount
FROM (SELECT Thread, Function, HitCount,
ROW_NUMBER() over (PARTITION BY Thread ORDER BY HitCount DESC) as R
FROM Samples
WHERE FunctionId NOT IN
(SELECT CalleeId FROM Callers)) t
WHERE R = 1
ORDER BY ThreadId, HitCount DESC
Alternative 4 & 5 - Utilise des constructions plus anciennes, si les fonctions fenêtrées ne sont pas disponibles, et dit ce que l'on entend un peu plus propre que l'utilisation joint. Benchmark si Spead est une priorité. Les deux retournent toutes les lignes qui participent à une égalité. Alternative 4 sera HitCount est nul lorsque les valeurs non nulles ne sont pas disponibles pour HitCount. L'option 5 ne retournera pas de lignes avec HitCount est nulle.
SELECT *
FROM Samples s1
WHERE FunctionId NOT IN
(SELECT CalleeId FROM Callers)
AND NOT EXISTS
(SELECT *
FROM Samples s2
WHERE s1.FunctionId = s2.FunctionId
AND s1.HitCount < s2.HitCount)
ORDER BY ThreadId, HitCount DESC
SELECT *
FROM Samples s1
WHERE FunctionId NOT IN
(SELECT CalleeId FROM Callers)
AND HitCount =
(SELECT MAX(HitCount)
FROM Samples s2
WHERE s1.FunctionId = s2.FunctionId)
ORDER BY ThreadId, HitCount DESC
Est-il possible qu'il y ait deux ThreadIds qui partagent la même functionId, avec le de ceux (ThreadId, FunctionId) dans les appelants, mais pas l'autre? Je demande, parce que les deux requêtes ci-dessus ne disent pas la même chose. –