SQL分配ID分区

时间:2018-12-20 15:47:05

标签: sql google-bigquery partitioning

我想为符合某些条件的行的分配唯一的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中获得此结果?

3 个答案:

答案 0 :(得分:3)

您可以使用DENSE_RANK

select t.*,dense_rank() over (order by date, hardware) as id
from table_name t;

db<>fiddle demo

答案 1 :(得分:2)

我会做的:

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

答案 2 :(得分:1)

在没有partition by子句的情况下,BigQuery中的窗口函数在大数据上可能会出现问题。它们可能会耗尽资源。

另一种替代方法是使用哈希分配ID:

select t.*, farm_fingerprint(cast(date as string), '|', hardware) as id
from table_name t;

id并不那么优雅。但是,如果由于资源不足而导致查询失败,则优雅的id很难让人感到安慰。