1
votes

SQL - Créez un nombre de catégories basé sur un nombre prédéfini de divisions

J'utilise BigQuery et j'essaie d'attribuer des valeurs catégorielles à chacun de mes enregistrements, en fonction du nombre de "fractionnements" qui lui sont attribués.

La table comporte un nombre cumulé d'enregistrements, regroupés au niveau STR - c'est-à-dire que s'il y a 4 SKU à 2 STR, les SKU seront étiquetés 1,2,3,4. Chaque STR se voit attribuer une valeur SPLIT, donc si la STR a une valeur SPLIT de 2, je veux qu'elle divise ses SKU en 2 catégories. Je souhaite créer une autre colonne qui attribuerait les SKU étiquetés 1-2 comme «1» et les SKU étiquetés 3-4 comme «2». (Les données réelles sont à une échelle beaucoup plus grande, mais je pensais que ce serait plus facile.)

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

La colonne SPLITS est dynamique, allant de 1 à 3. Le nombre de SKU dans chaque catégorie devrait être relativement égal, mais ce n'est pas une priorité autant que le nombre de groupes qui sont créés. Idéalement, la table finale avec la nouvelle colonne (HOST_NUMBER) ressemblerait à ceci:

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


0 commentaires

3 Réponses :


0
votes

Vous pouvez utiliser les fonctions de fenêtre et l'arithmétique:

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

En fait, ntile () semble faire exactement ce que vous voulez - et vous n'avez même pas besoin du Colonne sku_row_count (qui imite de toute façon row_number () ):

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


0 commentaires

0
votes

Si l'ordre des valeurs dans les groupes n'a pas d'importance, utilisez simplement l'arithmétique modulo:

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


0 commentaires

0
votes

Ci-dessous, pour BigQuery Standard SQL

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


0 commentaires