SQL Server紧凑支持窗口函数吗?
备选方案1 - 将包括所有打结的行。不包括行,如果给定线程的唯一行都有空的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 - 将非determistically挑领带的情况下,一排并丢弃等。将包括行如果在一个线程中的所有行具有空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 - 使用旧的结构,如果窗口功能不可用,并说是什么意思干净了一点比使用连接。基准如果spead是一个优先事项。两者都返回参与平局的所有行。当非空值不适用于HitCount时,备选4将HitCount为空。选项5不会返回HitCount为空的行。
WITH maxHits AS(
SELECT s.threadid,
MAX(s.hitcount) 'maxhits'
FROM SAMPLES s
JOIN CALLERS c ON c.threadid = s.threadid AND c.calleeid != s.functionid
GROUP BY s.threadid
)
SELECT t.*
FROM SAMPLES t
JOIN CALLERS c ON c.threadid = t.threadid AND c.calleeid != t.functionid
JOIN maxHits mh ON mh.threadid = t.threadid AND mh.maxhits = t.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
是否有可能为那里是共享同一FunctionId 2个线程ID,对那些(ThreadId,FunctionId)在呼叫者,但不是其他?我问,因为上面的两个查询没有说同样的事情。 – 2009-08-08 04:54:47