我正在尝试使用row_number()
这是我拥有的数据的示例:
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
答案 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