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