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;

db<>fiddle demo

我会做:

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 并不能起到什么作用。