为每个用户获取行,其中列中值的计数最大值为

时间:2015-06-26 12:05:55

标签: sql sql-server

此问题是对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

真诚感谢所有帮助

由于

1 个答案:

答案 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上获得较低的值。