Получайте последние обновления количества в течение недели - PullRequest
0 голосов
/ 13 октября 2019

Инвентарь обновляется для каждого склада в течение недели. Неделя начинается со среды (12:00:00) до вторника (11:59:59 PM).

Если я выберу месяц октября, у него будет 5 сред, 2 октября должны быть данные с 25 сентября по 1 октября.

  • Склад может обновлять запасы несколько раз в неделю, а затем получитьдата последнего изменения инвентаря
  • Если склад не обновил инвентарь, получите дату последнего изменения инвентаря для новой недели.

Код:

CREATE TABLE WarehouseUpdate
(
    WarehouseID INT
    ,WarehouseName VARCHAR(100)
    ,City VARCHAR(100)
    ,[State] VARCHAR(20)
    ,CurrentInventory INT
    ,ModifiedDate DATETIME2

)

SET @FromWed = DATEADD(DAY, - (DATEPART(dw, @ModifiedDate) + @@DATEFIRST - 4) % 7, @ModifiedDate);
SET @ToWed = DATEADD(DAY, - (DATEPART(dw, @ModifiedDate) + @@DATEFIRST - 4) % 7 + 7, @ModifiedDate);

INSERT INTO dbo.WarehouseUpdate
VALUES
(6541, 'XYZ','Huntsville','Alabama',658,'2019/10/07')
,(6541, 'XYZ','Huntsville','Alabama',941,'2019/10/08')
,(6417, 'ABC','Denver','Colorado',1001,'2019/09/26')
,(6541, 'XYZ','Huntsville','Alabama',745,'2019/09/29')
,(6589, 'JKL','Atlanta','Georgia',798,'2019/08/14')


/*Result should be for September 2019 (if the quantity is not updated for the warehouse, it should get CurrentInventory for last modified date), Inventory for Denver and Atlanta isn't updated after modified dates*/

For Wednesday 2nd
,(6541, 'XYZ','Huntsville','Alabama',745,'2019/09/29')
,(6417, 'ABC','Denver','Colorado',1001,'2019/09/26')
,(6589, 'JKL','Atlanta','Georgia',798,'2019/08/14')


For Wednesday 9th

(6541, 'XYZ','Huntsville','Alabama',941,'2019/10/08')
,(6417, 'ABC','Denver','Colorado',1001,'2019/09/26')
,(6589, 'JKL','Atlanta','Georgia',798,'2019/08/14')

1 Ответ

1 голос
/ 13 октября 2019

После комментария @Steve: типичное решение для этого будет включать создание календарной таблицы . Эта таблица будет содержать даты начала и окончания каждой недели (со среды по вторник). Должно быть довольно легко программно генерировать команды insert, которые будут заполнять таблицу.

create table calendar(
    FromDate date primary key, 
    ToDate date
);
insert into calendar values 
    ('2019-09-25', '2019-10-01'), 
    ('2019-10-02', '2019-10-08'),
    -- ... more weeks ...
;

Как только эта таблица будет на месте, вы можете просто join ее с таблицей инвентаризации и использоватьrow_number() для сохранения только самой последней записи в неделю:

select *
from (
    select 
        w.*,
        row_number() over(partition by c.FromDate order by w.ModifiedDate desc) rn
    from calendar c
    inner join WarehouseUpdate w on w.ModifiedDate between c.FromDate and c.ToDate
) x
where rn = 1

Без таблицы календаря вам нужно было бы динамически вычислять предыдущую среду (используя выражение, которое вы указали, и которое, кажется,работать нормально), и использовать его в качестве предложения разделения, например:

select *
from (
    select 
        w.*,
        row_number() over(
            partition by 
                DATEADD(
                    DAY, 
                    - (DATEPART(dw, ModifiedDate) + @@DATEFIRST - 4) % 7, 
                    ModifiedDate
                ) 
            order by ModifiedDate desc
        ) rn
    from WarehouseUpdate w
) x
where rn = 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...