我問在這裏發表幾周前的問題,現在球門柱略有感動:TSQL不同罪名2
我所發現的是,SuppressionType具有優先級和計數應該發生按降序優先。問題在於某些supressions具有相同的優先級,在這種情況下,SuppressionTypeID應該按照下降順序使用以創建不同的順序。
爲了解決這個問題,我在多個文件中統計了不同的行,因此是fileid。
我對SQL理想的結果下面是:
SuppressionTypeID FileID PersonCount
1 8786 2
2 8976 1
2 8977 1
我使用(從前面的問題)的演示代碼:
create table #t (
ID INT
,SuppressionTypeID INT
,priority int
,PersonID INT
,fileid int
)
INSERT INTO #t
SELECT 1
,1
,1
,123
,8976
UNION ALL
SELECT 2
,1
,1
,456
,8786
UNION ALL
SELECT 3
,2
,1
,456
,8976
UNION ALL
SELECT 4
,2
,1
,789
,8976
UNION ALL
SELECT 5
,2
,1
,123
,8977
create table #t1 (
ID INT
,SuppressionTypeID INT
,Priority int
,PersonID INT
,FileID int
,firstid INT
)
INSERT INTO #t1
SELECT *
,NULL
FROM #t
UPDATE t1
SET t1.firstid = t2.firstid
FROM #t1 AS t1
JOIN (
SELECT personid
, min(SuppressionTypeID) AS firstid
, FileID
FROM #t1
GROUP BY FileID, PersonID, Priority
) AS t2 ON t1.PersonID = t2.PersonID
AND t2.fileid = t1.FileID
SELECT coalesce(t2.firstid, t1.SuppressionTypeID) AS SuppressionTypeID
, t1.FileID
, count(DISTINCT t2.personid) AS PersonCount
FROM #t1 AS t1
LEFT JOIN #t1 AS t2 ON t1.personid = t2.personid
AND t1.SuppressionTypeID = t2.firstid
GROUP BY coalesce(t2.firstid, t1.SuppressionTypeID), t1.FileID
Order by t1.FileID, coalesce(t2.firstid, t1.SuppressionTypeID)
這apporach不必使用只要結果是正確的,如果有更好的方法。
在此先感謝
我也一直試試這個。我想獲得的秩爲1,並從那裏我可以總結出在秩= 1,但是這不太工作之一:
;WITH CTE AS (
SELECT SuppressionTypeID
, FileID
, PersonID
, [Priority]
, RANK() OVER (PARTITION BY FileID, [Priority], PersonID ORDER BY SuppressionTypeID) AS FirstID
FROM #t
)
SELECT * FROM CTE
理想的情況下我的結果將是:
SuppressionTypeID FileID PersonID Priority FirstID
1 8786 456 1 1
1 8976 123 1 1
2 8976 456 1 2
2 8976 789 1 1
2 8977 123 1 1
2 8977 456 1 1
你有兩套理想的結果。這是什麼? – Hogan
我在看Hogan的計劃。但總而言之,如果一個人受到更高優先級的壓制,我不希望他們再次計數。所以無論哪一個都可以解決,我可以合作。謝謝 – Raymondo