Распределение значений по неделям, взвешенное для начала недели - PullRequest
1 голос
/ 03 октября 2019

У меня есть количество отправлений в неделю. Я не хочу, чтобы они все были запланированы на пятницу. Я хочу разделить его на неделю

Например, если у меня будет 9 лотов для отправки на следующей неделе, я хочу 2 в день 1, 2 в день 2 и затем 1 в день для остальной части недели. Я пробовал кумулятивную сумму и столкнулся с очень похожей проблемой с другими данными, которые я решил с помощью вложенных циклов, но это взвешивание лотов до начала недели, из-за которого я боролся с этим. Я пробовал row_number и деление на дни, которые делят дни, но не в циклическом движении

-- Creates table 1
(SELECT 'SHIP1' SHIP_ID, '202014' SHIP_WK FROM DUAL UNION ALL
SELECT 'SHIP2', '202014' SHIP_WK FROM DUAL UNION ALL
SELECT 'SHIP3', '202014' SHIP_WK FROM DUAL UNION ALL
SELECT 'SHIP4', '202014' SHIP_WK FROM DUAL UNION ALL
SELECT 'SHIP5', '202014' SHIP_WK FROM DUAL UNION ALL
SELECT 'SHIP6', '202014' SHIP_WK FROM DUAL UNION ALL
SELECT 'SHIP7', '202014' SHIP_WK FROM DUAL UNION ALL
SELECT 'SHIP8', '202014' SHIP_WK FROM DUAL UNION ALL
SELECT 'SHIP9', '202014' SHIP_WK FROM DUAL UNION ALL
SELECT 'SHIP10', '202015' SHIP_WK FROM DUAL UNION ALL
SELECT 'SHIP11', '202015' SHIP_WK FROM DUAL) SHIPS
-- Creates table 2
(SELECT '202014' WEEK, '7' NO_DAYS FROM DUAL UNION ALL
SELECT '202015' WEEK, '5' NO_DAYS FROM DUAL) WEEK

Мне нужно, чтобы SHIP1 и SHIP2 продолжались в 1-й день недели 202014, а SHIP3 / 4 продолжалисьдень 2, а затем один день после этого. SHIP10 / 11 отправляются в день 1 и 2 202015, а затем в 3 дня с информацией об отправке NULL.

1 Ответ

4 голосов
/ 03 октября 2019

Аналитическая функция NTILE() - это именно то, что вам нужно.

with
  ships (ship_id, ship_wk) as (
    select 'SHIP1' , '202014' from dual union all
    select 'SHIP2' , '202014' from dual union all
    select 'SHIP3' , '202014' from dual union all
    select 'SHIP4' , '202014' from dual union all
    select 'SHIP5' , '202014' from dual union all
    select 'SHIP6' , '202014' from dual union all
    select 'SHIP7' , '202014' from dual union all
    select 'SHIP8' , '202014' from dual union all
    select 'SHIP9' , '202014' from dual union all
    select 'SHIP10', '202015' from dual union all
    select 'SHIP11', '202015' from dual)
,  weeks (week, no_days) as (
    select '202014', 7 from dual union all
    select '202015', 5 from dual
  )
select s.ship_id, s.ship_wk,
       ntile(w.no_days) over (partition by s.ship_wk, w.no_days 
                              order by s.ship_id) as day_no
from   ships s left outer join weeks w on s.ship_wk = w.week
;

ВЫХОД

SHIP_ID   SHIP_W DAY_NO
--------- ------ ------
SHIP1     202014      1
SHIP2     202014      1
SHIP3     202014      2
SHIP4     202014      2
SHIP5     202014      3
SHIP6     202014      4
SHIP7     202014      5
SHIP8     202014      6
SHIP9     202014      7
SHIP10    202015      1
SHIP11    202015      2

Это взгляд со стороны "корабля" иРаспределение дней недели. В исходном сообщении вы также говорите о NULL для дней недели, которые не используются;это можно добавить, но тогда неясно, с какой стороны вы смотрите на результат. Вам нужно знать, какие корабли ходят в каждый день каждой недели, или вам нужно знать для каждого корабля, в какую неделю и в какой день этой недели они должны быть отправлены?

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