【问题标题】:SQL - Create number of categories based on pre-defined number of splitsSQL - 根据预定义的拆分数量创建类别数量
【发布时间】:2020-11-24 18:20:50
【问题描述】:

我正在使用 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 数量应该相对相等,但这不是优先级,而只是创建的组数。理想情况下,包含新列 (HOST_NUMBER) 的最终表应如下所示:

+-----+------+---------------+--------+-------------+
| 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 |
+-----+------+---------------+--------+-------------+

【问题讨论】:

    标签: sql count google-bigquery window-functions


    【解决方案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_row_count 列(它基本上模仿了 row_number()):

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

        以下是 BigQuery 标准 SQL

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-12-14
          • 1970-01-01
          • 2016-09-15
          • 2021-08-15
          • 2018-05-22
          • 2020-09-19
          相关资源
          最近更新 更多