Группировка строк так, чтобы сумма столбцов составляла не более 10 на группу - PullRequest
1 голос
/ 25 июня 2019

У меня есть таблица, которая выглядит следующим образом:

col1
------
2
2
3
4
5
6
7

со значениями, отсортированными в порядке возрастания.

Я хочу назначить каждую строку группам с метками 0,1, ..., n, чтобы в каждой группе было не более 10. Таким образом, в приведенном выше примере это будет выглядеть так:

col1 |label
------------
2   0
2   0
3   0
4   1
5   1
6   2
7   3

Я пытался использовать это:

floor(sum(col1) OVER (partition by  ORDER BY col1 ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) /10))

Но это не работает правильно, потому что он выполняет операции как:

floor(2/10) = 0
floor([2+2]/10) = 0
floor([2+2+3]/10) = 0
floor([2+2+3+4]/10) = 1
floor([2+2+3+4+5]/10 = 1
floor([2+2+3+4+5+6]/10 = 2
floor([2+2+3+4+5+6+7]/10) = 2

Это все по совпадению верно до последнего расчета, потому что даже если

[2+2+3+4+5+6+7] / 10 = 2.9

и

floor(2.9) = 2

то, что он должен сделать, это понять, что 6 + 7 -> 10, поэтому 5-я строка со значением 7 должна находиться в своей собственной группе, поэтому выполните итерацию номера группы + 1 и выделите эту строку в новой группе.

Что я действительно хочу сделать, так это когда он встречает сумму> 10, затем устанавливает номер группы = номер группы + 1, выделяет ТЕКУЩУЮ СТРОКУ в эту новую группу, а затем, наконец, устанавливает новую стартовую строку как ТЕКУЩУЮ СТРОКУ .

1 Ответ

0 голосов
/ 25 июня 2019

Это слишком долго для комментария.

Решение этой проблемы требует сканирования таблицы, строка за строкой.В SQL это было бы через рекурсивный CTE (или иерархический запрос).Hive не поддерживает ни один из них.

Проблема в том, что каждый раз, когда определяется группа, разница между 10 и суммой "забывается".То есть, когда вы находитесь дальше в списке, то, что происходит раньше, не является простым накоплением доступных данных.Вы должны знать, как он был разбит на группы.

Связанная проблема разрешима .Связанная проблема будет назначать все строки группам размера 10, разбивая строки между двумя группами.Тогда вы будете знать, в какую группу входит более поздняя строка, основываясь только на совокупной сумме предыдущих строк.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...