
BigQuery(BQ) 对于数据分析或处理非常有用。
它擅长处理海量数据。 它在短时间内返回汇总结果。
通过数据处理,有时我们想做编号。
例如,提取每个类别中的第一到第三条记录。
为了获得整个数据的排名,我们应该使用 order by 子句。
但是我们怎样才能得到等级号呢?
而且如果4条记录的分数相同,则很难选择3条记录。
我们如何才能不重复地对记录进行编号?
所以今天我介绍一下“How to rank data considering duplication in BigQuery”。
作者

阅读优势
您可以了解“如何在 BigQuery 中考虑重复对数据进行排名”。 那么你不必担心编号。
如何在 BigQuery 中排名
有一些方法可以在 BigQuery 中进行排名。
Numbering in BQ
- RANK
- DENSE_RANK
- ROW_NUMBER
它们是不同的功能。
所以介绍一下各个功能。
数据
无论如何,我们应该准备数据。
将此 CSV 文件导入为“rank_sample”表。
Data
id,val 001,100 002,120 003,130 004,100 005,110 006,160 007,170 008,100 009,120 010,200
使用此表,检查每个编号功能。
RANK
正如其名称,RANK
是排名函数。
我们可以像RANK() OVER(ORDER BY <您想要排名的列名>)
一样使用它。
SQL
SELECT *, RANK() OVER(ORDER BY val) as rank FROM test.rank_sample order by id
Result
Row | id | val | rank |
1 | 1 | 100 | 1 |
2 | 2 | 120 | 5 |
3 | 3 | 130 | 7 |
4 | 4 | 100 | 1 |
5 | 5 | 110 | 4 |
6 | 6 | 160 | 8 |
7 | 7 | 170 | 9 |
8 | 8 | 100 | 1 |
9 | 9 | 120 | 5 |
10 | 10 | 200 | 10 |
根据结果,我们可以在排名列中看到第 1 到第 10。
val=100
记录都是第 1,下一个 val=110
记录是第 4。
这意味着 rank
函数将相同的分数视为相同的排名并跳过下一个数字。
Reference
DENSE_RANK
DENSE_RANK
是编号函数不会跳过重复的排名。
我们可以像 DENSE_RANK() OVER(ORDER BY <column name>)
一样使用它。
SQL
SELECT *, DENSE_RANK() OVER(ORDER BY val) as dense_rank FROM test.rank_sample order by id
Result
Row | id | val | dense_rank |
1 | 1 | 100 | 1 |
2 | 2 | 120 | 3 |
3 | 3 | 130 | 4 |
4 | 4 | 100 | 1 |
5 | 5 | 110 | 2 |
6 | 6 | 160 | 5 |
7 | 7 | 170 | 6 |
8 | 8 | 100 | 1 |
9 | 9 | 120 | 3 |
10 | 10 | 200 | 7 |
我们可以看到 rank 从 ast 到 7th。
与 RANK()
的区别在于 val=110
记录不是第 4 名而是第 2 名。
所以 DENSE_RANK
不会跳过重复的排名。
Reference
ROW_NUMBER
ROW_NUMBER
不是用于排名,而是用于设置行号。
但是我们可以像 ROW_NUMBER() OVER(ORDER BY <column name>)
一样使用它,就像 RANK()
函数一样。
SQL
SELECT *, ROW_NUMBER() OVER(ORDER BY val) as dense_rank FROM test.rank_sample order by id
Result
Row | id | val | row_number |
1 | 1 | 100 | 1 |
2 | 2 | 120 | 5 |
3 | 3 | 130 | 7 |
4 | 4 | 100 | 2 |
5 | 5 | 110 | 4 |
6 | 6 | 160 | 8 |
7 | 7 | 170 | 9 |
8 | 8 | 100 | 3 |
9 | 9 | 120 | 6 |
10 | 10 | 200 | 10 |
根据结果,我们可以看到从 1 号到 10 号。
独特之处在于val=100
数据中有第2条和第3条记录。
ROW_NUMBER
只是放置行号。 所以即使在相同的分数记录中,它们也有不同的数字。
Reference
比较
我们将 RANK
、DENSE_RANK
、ROW_NUMBER
分类如下。
Function | Description |
---|---|
RANK | Same rank in same score. If there are three 1st records,next is 4th. |
DENSE_RANK | Same rank in same score. If there are three 1st records,next is 2nd. |
ROW_NUMBER | Even in same score, it numbers different number. |
SQL
SELECT *, RANK() OVER(ORDER BY val) as rank, DENSE_RANK() OVER(ORDER BY val) as dense_rank, ROW_NUMBER() OVER(ORDER BY val) as row_number FROM test.rank_sample order by id
Result
Row | id | val | rank | dense_rank | row_number |
1 | 1 | 100 | 1 | 1 | 1 |
2 | 2 | 120 | 5 | 3 | 5 |
3 | 3 | 130 | 7 | 4 | 7 |
4 | 4 | 100 | 1 | 1 | 2 |
5 | 5 | 110 | 4 | 2 | 4 |
6 | 6 | 160 | 8 | 5 | 8 |
7 | 7 | 170 | 9 | 6 | 9 |
8 | 8 | 100 | 1 | 1 | 3 |
9 | 9 | 120 | 5 | 3 | 6 |
10 | 10 | 200 | 10 | 7 | 10 |
结论
今天我描述了“如何在 BigQuery 中考虑重复数据排名”。
下面有一些排名功能。
Numbering function in BQ
每个功能如下。
Function | Description |
---|---|
RANK | 相同的排名相同的分数。 如果有三个第一个记录,则下一个是第四个。 |
DENSE_RANK | 相同的排名相同的分数。 如果有三个第一个记录,下一个是第二个。 |
ROW_NUMBER | 即使在相同的分数下,它的编号也不同。 |

ROW_NUMBER
避免重复令人印象深刻。还有一些关于 BigQuey 的其他文章。
如果您对它们感兴趣,请阅读它们。