简述row_number(),rank()和dense_rank()的区别 ?

在Hive中,row_number()、rank()和dense_rank()是用于窗口函数(Window Function)的三个常见函数,它们可以用来对数据集中的行进行排序和编号。以下是这三个函数的区别:

  1. row_number():为每一行分配一个唯一的序号,序号从1开始递增。如果两行或多行具有相同的排序值,它们将获得相同的序号。row_number()不会在值之间留下任何“空隙”,即如果某一行的排序值比前一行大,下一行的序号将增加1。
  2. rank():为每一行分配一个排名值,排名值从1开始递增。如果两行或多行具有相同的排序值,它们将获得相同的排名值。与row_number()不同,rank()会在值之间留下空隙。例如,如果有两行并列排名第一,下一行的排名将为3而不是2。
  3. dense_rank():与rank()类似,为每一行分配一个排名值。但是,与rank()不同的是,dense_rank()不会在值之间留下空隙。如果两行或多行具有相同的排序值,它们将获得相同的排名值,并且下一行的排名将增加1。

应用场景示例:

假设有一个包含以下数据的表格,按照分数进行升序排序:

| id | score |
|----|-------|
| 1  | 80    |
| 2  | 85    |
| 3  | 85    |
| 4  | 90    |

使用row_number()函数:

| id | score | row_number() |
|----|-------|--------------|
| 1  | 80    | 1            |
| 2  | 85    | 2            |
| 3  | 85    | 2            |
| 4  | 90    | 3            |

使用rank()函数:

| id | score | rank() |
|----|-------|--------|
| 1  | 80    | 1      |
| 2  | 85    | 2      |
| 3  | 85    | 2      |
| 4  | 90    | 4      |

使用dense_rank()函数:

| id | score | dense_rank() |
|----|-------|--------------|
| 1  | 80    | 1            |
| 2  | 85    | 2            |
| 3  | 85    | 2            |
| 4  | 90    | 3            |

发表评论

后才能评论