SQL 分配 ID 分区依据
SQL assign ID partition by
我想为满足某些条件的 组 行分配唯一 ID。在下面的示例中,我想根据 数据和硬件
分配一个唯一 ID
示例:
date, hardware, color
1990, 8989, blue
1990, 8989, yellow
1991, 8989, blue
1991, 3333, blue
1991, 8989, black
预期结果
date, hardware, color, ID
1990, 8989, blue, 1
1990, 8989, yellow, 1
1991, 8989, blue, 2
1991, 3333, blue, 3
1991, 8989, black, 2
如何在 BigQuery 中获得此结果?
您可以使用 DENSE_RANK
:
select t.*,dense_rank() over (order by date, hardware) as id
from table_name t;
我会做:
with
x as (
select distinct date, hardware from my_table
),
y as (
select
date,
hardware,
row_number() over(order by date, hardware) as rn
from x
)
select
t.*, y.rn
from my_table t
join y on y.date = t.date and y.hardware = t.hardware
如果没有 partition by
子句,BigQuery 中的 Window 函数在大数据上可能会出现问题。他们可以 运行 资源不足。
另一种方法是使用哈希分配一个 id:
select t.*, farm_fingerprint(cast(date as string), '|', hardware) as id
from table_name t;
id
没那么优雅。但是,如果您的查询由于缺乏资源而失败,那么优雅的 ID 并不能起到什么作用。
我想为满足某些条件的 组 行分配唯一 ID。在下面的示例中,我想根据 数据和硬件
分配一个唯一 ID示例:
date, hardware, color
1990, 8989, blue
1990, 8989, yellow
1991, 8989, blue
1991, 3333, blue
1991, 8989, black
预期结果
date, hardware, color, ID
1990, 8989, blue, 1
1990, 8989, yellow, 1
1991, 8989, blue, 2
1991, 3333, blue, 3
1991, 8989, black, 2
如何在 BigQuery 中获得此结果?
您可以使用 DENSE_RANK
:
select t.*,dense_rank() over (order by date, hardware) as id
from table_name t;
我会做:
with
x as (
select distinct date, hardware from my_table
),
y as (
select
date,
hardware,
row_number() over(order by date, hardware) as rn
from x
)
select
t.*, y.rn
from my_table t
join y on y.date = t.date and y.hardware = t.hardware
partition by
子句,BigQuery 中的 Window 函数在大数据上可能会出现问题。他们可以 运行 资源不足。
另一种方法是使用哈希分配一个 id:
select t.*, farm_fingerprint(cast(date as string), '|', hardware) as id
from table_name t;
id
没那么优雅。但是,如果您的查询由于缺乏资源而失败,那么优雅的 ID 并不能起到什么作用。