#sql #sql-server
#sql #sql-сервер
Вопрос:
вот тестовые данные:
declare @trial table (id int, val int)
insert into @trial (id, val)
values (1, 1), (2, 3),(3, 2), (4, 4), (5, 5),(6, 6), (7, 7), (8, 2),(9, 3), (10, 4), (11, 6),(12, 10), (13, 5), (14, 3),(15, 2) ;
select * from @trial order by id asc
описание данных:
у меня есть список из n значений, которые представляют суммы. предположим, что для этого примера они равны (10, 53). значения в @trial могут быть как отрицательными, так и положительными. обратите внимание, что значения в @trial всегда будут суммироваться с заданными суммами.
описание шаблона: 10 в этом примере — это 1-я сумма, которую я хочу сопоставить, а 53 — это 2-я сумма, которую я хочу сопоставить. набор данных был настроен таким образом, что блок последовательных строк всегда будет суммироваться с этими суммами с помощью этой функции: в этом примере первые 4 строки суммируются с 10, а затем следующие 11 строк суммируются с 53. набор данных всегда будет иметь эту функцию. другими словами, 1-ю заданную сумму можно найти из суммирования 1 в i-ю строку, затем 2-ю сумму из i 1 строки в j-ю строку и так далее….
наконец, я хочу идентификатор для идентификации групп строк, которые суммируются с заданными суммами. итак, в этом примере 1-4-я строки будут принимать идентификатор 1, с 5-й по 15-ю строку будет принимать идентификатор 2.
Комментарии:
1. SQL-2016? Вы, вероятно, имеете в виду MS SQL Server 2016…
2. Что, если значения точно не складываются?
3. да, ms sql server 2016, извинения
4. значения всегда будут складываться 🙂
Ответ №1:
Это отвечает на исходный вопрос.
Из того, что вы описываете, вы можете сделать что-то вроде этого:
select v.grp, t.*
from (select t.*, sum(val) over (order by id) as running_val
from @trial t
) t left join
(select grp lag(upper, 1, -1) over (order by upper) as lower, uper
from (values (1, 10), (2, 53)) v(grp, upper)
) v
on t.running_val > lower and
t.running_val <= v.upper
Комментарии:
1. ну, это было быстро 🙂 спасибо. я скоро вернусь к вам
2. я получаю нулевой идентификатор группы для последних 3 строк?
3. я отметил, что в вопросе идентификатор строки 5-15 должен принимать идентификатор группы 2 в этом примере
4.
.....select grp, isnull(sum(upper) over(order by grp rows between unbounded preceding and 1 preceding), 0) as lower, sum(upper) over(order by grp) as upper from (values (1, 10) .....
5. @charliealpha . . . Задайте другой вопрос с четким и полным описанием проблемы. Я не отвечаю на «развивающиеся» вопросы.