У мене є таблиця, яка містить стовпець десяткових значень, такий як цей:
id value size
-- ----- ----
1 100 .02
2 99 .38
3 98 .13
4 97 .35
5 96 .15
6 95 .57
7 94 .25
8 93 .15
Що мені потрібно зробити, це описати трохи важко, тому будь ласка, майте мене. Що я намагаюся зробити, це створити сукупне значення size
стовпця, який збільшується на 1 кожен раз, коли попередні рядки підсумовують 1, коли у порядку зменшення відповідно до value
. Результат виглядатиме приблизно так:
id value size bucket
-- ----- ---- ------
1 100 .02 1
2 99 .38 1
3 98 .13 1
4 97 .35 1
5 96 .15 2
6 95 .57 2
7 94 .25 2
8 93 .15 3
Першою моєю наївною спробою було зберегти пробіг, SUM
а потім CEILING
це значення, однак це не обробляє той випадок, коли деякі записи в size
кінцевому рахунку вносять внесок у загальну кількість двох окремих відрізків. Наведений нижче приклад може пояснити це:
id value size crude_sum crude_bucket distinct_sum bucket
-- ----- ---- --------- ------------ ------------ ------
1 100 .02 .02 1 .02 1
2 99 .38 .40 1 .40 1
3 98 .13 .53 1 .53 1
4 97 .35 .88 1 .88 1
5 96 .15 1.03 2 .15 2
6 95 .57 1.60 2 .72 2
7 94 .25 1.85 2 .97 2
8 93 .15 2.00 2 .15 3
Як ви можете бачити, якби я просто використовувати CEILING
на crude_sum
записи # 8 буде призначено відром 2. Це викликано size
записи # 5 і # 8 розколюються на два відра. Натомість ідеальним рішенням є скидання суми щоразу, коли вона досягає 1, після чого збільшується bucket
стовпчик і починається нова SUM
операція, починаючи зі size
значення поточного запису. Оскільки порядок записів важливий для цієї операції, я включив value
стовпчик, який призначений для сортування у порядку зменшення.
Мої початкові спроби включали в себе кілька пропусків даних, один раз для виконання SUM
операції, ще раз для CEILING
цього тощо. Ось приклад того, що я зробив для створення crude_sum
стовпця:
SELECT
id,
value,
size,
(SELECT TOP 1 SUM(size) FROM table t2 WHERE t2.value<=t1.value) as crude_sum
FROM
table t1
Який використовувався в UPDATE
операції для вставки значення в таблицю, з якою можна працювати згодом.
Редагувати: Я хотів би скористатися ще однією проблемою, щоб пояснити це, ось що. Уявіть, що кожен запис є фізичним предметом. Цей елемент має пов'язане з ним значення та фізичний розмір менше одиниці. У мене є серія відра з об’ємною ємністю рівно 1, і мені потрібно визначити, скільки з цих відер мені знадобиться і яке відро входить до кожного товару відповідно до значення предмета, відсортованого від найвищого до найнижчого.
Фізичний предмет не може існувати в двох місцях одночасно, тому він повинен бути в одному відрі або іншому. Ось чому я не можу виконати загальне CEILING
рішення + , оскільки це дозволило б записам збільшити розмір у два відра.
distinct_count
складних речей. Aaron Bertrand має велике резюме ваших варіантів роботи на SQL Server для такого роду роботи з вікон. Я використовував метод "химерного оновлення" для обчислення distinct_sum
, який ви можете побачити тут, на SQL Fiddle , але це ненадійно.