SQL Server Compact поддерживает оконные функции?
Альтернатива 1 - будет включать все связывающие строки. Не будет включать строку, если все строки данного потока имеют значение null для 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
Альтернатива 2 - будет включать все связывающие строки. Если для данного потока с ненулевым значением HitCount нет строки, будут возвращены все строки для этого потока:
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
Альтернатива 3 - будет недетерминистически выбирать один ряд в случае связей и отбрасывать другие. Будет включать строку, если все строки для данного потока имеют нулевое значение HitCount
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
Альтернатива 4 и 5 - использует более старые конструкции, если оконные функции недоступны, и говорит, что подразумевается немного чище, чем использование объединений. Ориентир, если спид является приоритетом. Оба возвращают все строки, которые участвуют в ничьей. В альтернативе 4 HitCount будет нулевым, если ненулевые значения недоступны для HitCount. Альтернатива 5 не будет возвращать строки с HitCount, равным нулю.
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