У меня есть таблица, которая выглядит следующим образом:
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, выделяет ТЕКУЩУЮ СТРОКУ в эту новую группу, а затем, наконец, устанавливает новую стартовую строку как ТЕКУЩУЮ СТРОКУ .