2015-06-26 91 views
0

此問題是對this question的更新。獲取列中每個用戶的計數值最大的行++

我的立柱結構:

Column0 Column1 Column2 
aaa  abc  a 
aaa  abc  a 
aaa  abc  b 
aaa  abc  a 
aaa  abc  b 
aaa  abc  NA 
aaa  xyx  b 
aaa  NA  b 
bbb  fgh  v 
bbb  fgh  NA 
bbb  fgh  NA 
bbb  NA  m 
bbb  NA  m 
bbb  NA  m 
bbb  NA  NA 
bbb  NA  NA 
ccc  NA  NA 
ccc  NA  NA 
ccc  NA  NA 

我想早起是不同的foreach「Column0」數據「列1」的數據,其計數爲最大,除非該數據是NA在這種情況下獲得的第二高。 如果對於'Column0'數據,'Column1'的所有值都是NA,那麼該值可以是NA。

同樣的規則也適用於此處。此外,對於'Column2',我希望在'Column1'的預期回答中應用相同的規則。

因此,儘管對於'Column0'值'aaa',b的'Column2'值更多,我希望以'Column2'作爲答案。 這是因爲'Column1'中的查詢結果是'Column0'值'aaa'的'abc',而'Column2'中的所述'Column1'值中的'a'更多。

同樣,即使對於「Column0」值「BBB」的「列2」 m和值的數量NA較多,我希望得到的答案爲「列2」作爲訴

正如前面我們除非所有值都是NA,否則不考慮NA的值。

所以期望值:

Column0 Column1 Column2 
aaa  abc  a 
bbb  fgh  v 
ccc  NA  NA 

所有幫助表示衷心感謝

感謝

+0

請不要評論以前的問題/答案,並要求人們看看你的新問題。活躍用戶在線時自然會看到問題,他們不需要用消息進行溝通。用戶放棄自己的時間去幫助,他們不希望有人直接聯繫他們尋求幫助。 – Tanner

回答

0

相同的前一個問題的回答的,你可以使用count窗口功能,但增加對所有列進行分區的額外count,並首先對第一列中的流行值排序row_number,然後對兩列的流行值進行排序。

;WITH Counts AS 
(
    SELECT column0, column1, column2, 
      COUNT(nullif(column1,'NA')) OVER (PARTITION BY column0, column1) cntCol1, 
      COUNT(nullif(Column2,'NA')) OVER (PARTITION BY Column0, Column1, Column2) cntCol2 
    FROM @t 
) 
, ranked AS 
(
    SELECT column0, column1, column2, 
      row_number() OVER (PARTITION BY Column0 ORDER BY cntcol1 desc, cntcol2 desc) rnr 
    FROM counts 
) 
SELECT Column0, Column1, Column2 
FROM ranked 
where rnr = 1 

將Column記錄將成爲普遍COLUMN1記錄裏面,因爲在cntcol1一階迫使這些記錄來第一次因爲cntCol2是基於兩列2和列1,將其值的基礎上計column1內的column2(以及作爲主分區的column0)。

NullIf(column,'NA')用於強制'NA'在count s上獲得較低的值。

相關問題