SQL-基于预定义的拆分数创建类别数

SQL-基于预定义的拆分数创建类别数,sql,count,google-bigquery,window-functions,Sql,Count,Google Bigquery,Window Functions,我正在使用BigQuery,并试图根据分配给每个记录的“拆分”数量,为其分配分类值 该表具有累积记录计数,按STR级别分组-即,如果在2个STR中有4个SKU,则SKU将标记为1,2,3,4。每个STR都分配了一个拆分值,因此如果STR的拆分值为2,我希望它将其SKU拆分为2个类别。我想创建另一列,将标记为1-2的SKU指定为“1”,将标记为3-4的SKU指定为“2”。(实际数据规模要大得多,但我认为这会更容易。) “拆分”列是动态的,范围从1到3。每个类别中的SKU数量应该相对相等,但这并不像

我正在使用BigQuery,并试图根据分配给每个记录的“拆分”数量,为其分配分类值

该表具有累积记录计数,按STR级别分组-即,如果在2个STR中有4个SKU,则SKU将标记为1,2,3,4。每个STR都分配了一个拆分值,因此如果STR的拆分值为2,我希望它将其SKU拆分为2个类别。我想创建另一列,将标记为1-2的SKU指定为“1”,将标记为3-4的SKU指定为“2”。(实际数据规模要大得多,但我认为这会更容易。)

“拆分”列是动态的,范围从1到3。每个类别中的SKU数量应该相对相等,但这并不像创建的组数量那样重要。理想情况下,带有新列(主机编号)的最终表格如下所示:

+-----+------+---------------+--------+-------------+
| STR | SKU  | SKU_ROW_COUNT | SPLITS | HOST_NUMBER |
+-----+------+---------------+--------+-------------+
|   1 | 1230 |             1 |      3 |           1 |
|   1 | 1231 |             2 |      3 |           1 |
|   1 | 1232 |             3 |      3 |           2 |
|   1 | 1233 |             4 |      3 |           2 |
|   1 | 1234 |             5 |      3 |           3 |
|   1 | 1235 |             6 |      3 |           3 |
|   2 | 1310 |             1 |      2 |           1 |
|   2 | 1311 |             2 |      2 |           1 |
|   2 | 1312 |             3 |      2 |           2 |
|   2 | 1313 |             4 |      2 |           2 |
|   3 | 2345 |             1 |      1 |           1 |
|   3 | 2346 |             2 |      1 |           1 |
|   3 | 2347 |             3 |      1 |           1 |
+-----+------+---------------+--------+-------------+

您可以使用窗口函数和算术:

select 
    t.*,
    1 + floor((sku_row_count - 1) * splits / count(*) over(partition by str)) host_number
from mytable t
order by sku
实际上,
ntile()
似乎正是你想要的——而且你甚至不需要
sku\u row\u count
列(它基本上模仿了
row\u number()
):


您可以使用窗口函数和算术:

select 
    t.*,
    1 + floor((sku_row_count - 1) * splits / count(*) over(partition by str)) host_number
from mytable t
order by sku
实际上,
ntile()
似乎正是你想要的——而且你甚至不需要
sku\u row\u count
列(它基本上模仿了
row\u number()
):


如果组中值的顺序无关紧要,只需使用模运算:

select t.*, (SKU_ROW_COUNT % SPLITS) as split_group
from t

如果组中值的顺序无关紧要,只需使用模运算:

select t.*, (SKU_ROW_COUNT % SPLITS) as split_group
from t

下面是BigQuery标准SQL

#standardSQL
SELECT *, 1 + MOD(SKU_ROW_COUNT, SPLITS) AS HOST_NUMBER 
FROM `project.dataset.table`

下面是BigQuery标准SQL

#standardSQL
SELECT *, 1 + MOD(SKU_ROW_COUNT, SPLITS) AS HOST_NUMBER 
FROM `project.dataset.table`