Группировать по значениям, каждое из которых кратно числу - PullRequest
0 голосов
/ 28 февраля 2020

Это таблица т. Я хочу сгруппировать его каждый раз, когда TotalQty> = 5n (пусть n = group). т. е. как только TotalQty> = 5n, я хочу сложить кол-во от n-1 до n.

ID  DateCreated  CurrQty
1   01-20-2020      1  
2   01-21-2020      4        
3   01-22-2020      3     
4   01-23-2020      3      
5   01-25-2020      1      
6   02-13-2020      3              
7   02-16-2020      2      

С помощью этого запроса я могу довольно близко, но я не считаю предыдущий "действительным" TotalQty + 5

select DateCreated, CurrQty, TotalQty
, ceiling(TotalQty/5.0) GroupNum
from
(
  select DateCreated, CurrQty
  , SUM(CurrQty) OVER (ORDER BY DateCreated ROWS BETWEEN UNBOUNDED PRECEDING AND 0 PRECEDING) TotalQty
  from t
) t2

ID  DateCreated  CurrQty   TotalQty   GroupNum  
1   01-20-2020      1         1          1                 
2   01-21-2020      4         5          1                  
3   01-22-2020      3         8          2                  
4   01-23-2020      3         11         3
5   01-25-2020      1         12         3 
6   02-13-2020      3         15         3                  
7   02-16-2020      2         17         4    

---

Как мне получить этот результат?

ID  DateCreated  CurrQty   TotalQty   GroupNum  
1   01-20-2020      1         1          1                 
2   01-21-2020      4         5          1                  
3   01-22-2020      3         8          2                  
4   01-23-2020      3         11         2 (from ID2, 11 >= (5+5))
5   01-25-2020      1         12         3
6   02-13-2020      3         15         3                  
7   02-16-2020      2         17         3 (from ID4, 17 >= (11+5))     

И так далее, следующая группа будет до 17 + 5 = 22 * ​​1014 *

1 Ответ

1 голос
/ 28 февраля 2020

Для этого нужно использовать рекурсивный CTE:

with cte as (
      select id, datecreated, currqty, currqty as totalqty, 1 as groupnum
      from t
      where id = 1
      union all
      select t.id, t.datecreated, t.currqty,
             (case when cte.totalqty >= 5 then t.currqty else t.currqty + cte.totalqty end),
             (case when cte.totalqty >= 5 then groupnum + 1 else groupnum end)
      from cte join
           t
           on t.id = cte.id + 1
     )
select *
from cte;

РЕДАКТИРОВАТЬ:

Держись. Я думаю, что ответ проще.

select t.*,
       1 + ceil((totalqty - qty + 1) / 5.0)
from (select t.*,
             sum(qty) over (order by date) as totalqty
      from t
     ) t;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...