使用row_number(或替代方法)按组计数,并且每个组也唯一?

时间:2019-08-27 20:47:53

标签: sql sql-server

我正在尝试使用row_number()

计算每个帐户ID的不同值

这是我拥有的数据的示例:


ID | val
_____________
1  | a
1  | a
1  | b
2  | a
3  | c
3  | a
3  | b
4  | d
4  | d
5  | a

我想基本上计算每个唯一ID的唯一值。我尝试使用row_number() partition over

这是我想要的输出示例:

ID | val | rank | count
_____________
1  | a  | 1  | 2
1  | b  | 2  | 3
2  | a  | 1  | 1
3  | c  | 1  | 1
3  | a  | 2  | 1
3  | b  | 3  | 3
4  | d  | 1  | 2
4  | e  | 2  | 2
5  | a  | 1  | 1

我已经尝试过了:

%sql
-- Show 
select * from (
select `ID`,`val`, dense_rank() over (partition by `ID` order by `val` asc) as row_num
from table1
)
order by `ID` asc


根据新ID重置计数,但不计算不同的val。又给我这个:

ID | val | rank
_____________
1  | a  | 1
1  | a  | 2
1  | b  | 3
2  | a  | 1
3  | c  | 1
3  | a  | 2
3  | b  | 3
3  | b  | 4
3  | b  | 5
4  | d  | 1
4  | d  | 2
4  | e  | 3
4  | e  | 4
5  | a  | 1

1 个答案:

答案 0 :(得分:0)

您可以使用dense_rank()对其进行订购。 。 。

select id, val, dense_rank() over (partition by id order by val) as seqnum
from t;

但是,结果排名将按字母顺序排列。您的样本表明您想保留原始顺序。如果是这样,则首先需要一个表示顺序的列。然后,您可以使用两种聚合级别:

select id, val, dense_rank() over (partition by id order by min_oc)
from (select t.*, min(<ordering column>) over (partition by id, val) as min_oc
      from t
     ) t