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

siv3szwd  于 2021-07-24  发布在  Java
关注(0)|答案(3)|浏览(233)

我正在使用bigquery,并尝试根据分配给每个记录的“拆分”数量,为其分配分类值。
该表具有按str级别分组的累计记录计数,即,如果在2 str处有4个sku,则sku将被标记为1、2、3、4。每个str都分配了一个split值,因此如果str的split值为2,我希望它将sku分为2个类别。我想创建另一列,将标记为1-2的SKU指定为“1”,将标记为3-4的SKU指定为“2”(实际数据的规模要大得多,但我认为这会更容易。)

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

splits列是动态的,范围从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 |
+-----+------+---------------+--------+-------------+
lsmd5eda

lsmd5eda1#

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

select 
    t.*,
    1 + floor((sku_row_count - 1) * splits / count(*) over(partition by str)) host_number
from mytable t
order by sku

事实上, ntile() 似乎做了你想做的-你甚至不需要 sku_row_count 列(基本上模仿 row_number() 无论如何):

select 
    t.*,
    ntile(splits) over(partition by str order by sku) host_number
from mytable t
order by sku
xqnpmsa8

xqnpmsa82#

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

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

quhf5bfb3#

下面是bigquery标准sql


# standardSQL

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

相关问题