SQL-基于预定义的拆分数创建类别数
我正在使用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数量应该相对相等,但这并不像创建的组数量那样重要。理想情况下,带有新列(主机编号)的最终表格如下所示: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数量应该相对相等,但这并不像
+-----+------+---------------+--------+-------------+
| 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`