此问题是对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
我希望早些时候得到的是另一个独特的' Column0'数据'第1列'计数为max的数据,除非该数据为NA,在这种情况下得到第二高的数据。 如果是对于#0; Column0'数据< Column1'的所有值是NA然后值可以是NA。
同样的规则也适用于此。此外,对于' Column2',我希望对#Column;' Column1'
的预期答案应用相同的规则所以即使对于#0; Column0'价值' aaa' ' Column2'的数量b的值更多,我希望得到#2; Column2'作为一个。 这是因为查询结果在< Column1'是' abc'对于#0; Column0'价值' aaa'在所说的第1列'之中' Column2',' a'中的值更多。
同样,即使对于< Column0'价值' bbb' ' Column2'的数量m和NA的值更多,我希望得到#2; Column2'如v。
如前所述,除非所有值均为NA,否则我们不会考虑NA值。
所以期望值:
Column0 Column1 Column2
aaa abc a
bbb fgh v
ccc NA NA
真诚感谢所有帮助
由于
答案 0 :(得分:0)
与上一个问题的回答中使用的相同,您可以使用count
窗口函数,但在所有列上添加一个额外的count
分区,并首先排序row_number
第1列中的普遍值,然后是两列的普遍值。
;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
column2记录将位于流行的column1记录中,因为cntcol1上的第一个顺序会强制这些记录首先出现,因为cntCol2同时基于column2和column1,其值将基于column1中column2的计数(和column0是主分区)。
NullIf(column,'NA')
用于强迫“NA'在count
上获得较低的值。