2015-09-18 47 views
0

我問在這裏發表幾周前的問題,現在球門柱略有感動:TSQL不同罪名2

TSQL Distinct Counts

我所發現的是,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 
+0

你有兩套理想的結果。這是什麼? – Hogan

+0

我在看Hogan的計劃。但總而言之,如果一個人受到更高優先級的壓制,我不希望他們再次計數。所以無論哪一個都可以解決,我可以合作。謝謝 – Raymondo

回答

0

嘗試分裂SQL零件和建設:

這將讓每一個是PersonID例如,根據SuppressionID,...寫到FileID優先

SELECT * FROM 
(SELECT *, Row_Number() OVER (partition by PersonID ORDER By SuppressionTypeID,...) AS RN FROM #T) A 
WHERE RN = 1 

然後使用它作爲Count查詢的來源。

+0

對於FileID 8977,仍然不起作用Personir 123爲exlcuded。我需要每個文件不同的計數,正如我原先所說 – Raymondo

+0

修正,我的虛擬數據也是錯誤的,您的查詢工程Amir – Raymondo