数据库

如何在 BigQuery 中考虑重复对数据进行排名

2023-02-23

Share this for your friends.

如何在 BigQuery 中考虑重复对数据进行排名

我们如何在 BigQuery 中对数据进行排名?


BigQuery(BQ) 对于数据分析或处理非常有用。

它擅长处理海量数据。 它在短时间内返回汇总结果。


通过数据处理,有时我们想做编号。

例如,提取每个类别中的第一到第三条记录。

为了获得整个数据的排名,我们应该使用 order by 子句。

但是我们怎样才能得到等级号呢?

而且如果4条记录的分数相同,则很难选择3条记录。

我们如何才能不重复地对记录进行编号?

所以今天我介绍一下How to rank data considering duplication in BigQuery

作者


中级工程师(AI、系统)。 擅长Python和SQL。

阅读优势

您可以了解“如何在 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 函数将相同的分数视为相同的排名并跳过下一个数字




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 不会跳过重复的排名




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 只是放置行号。 所以即使在相同的分数记录中,它们也有不同的数字。




比较

我们将 RANKDENSE_RANKROW_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

  • RANK
  • DENSE_RANK
  • ROW_NUMBER

  • 每个功能如下。

    Function Description
    RANK 相同的排名相同的分数。 如果有三个第一个记录,则下一个是第四个。
    DENSE_RANK 相同的排名相同的分数。 如果有三个第一个记录,下一个是第二个。
    ROW_NUMBER 即使在相同的分数下,它的编号也不同。


    使用 ROW_NUMBER 避免重复令人印象深刻。


    BigQuery Book


    还有一些关于 BigQuey 的其他文章。

    如果您对它们感兴趣,请阅读它们。


    Share this for your friends.

    If you felt this article is useful, please share.

    にほんブログ村 IT技術ブログへ

    -数据库
    -

    © 2024 ITips