다음은 창 기능을 사용하는 솔루션입니다. 주어진 상점에 대한 가장 오래된 레코드 (가장 낮은 일 값)는 인벤토리 값이 올바르게 설정되어 있다고 가정합니다. 여기에서 계산 된 값을 모든 다음 레코드로 케스케이드하는 시작점입니다. 다른 모든 재고 값 값은 계산시 무시됩니다.
그런 다음 업데이트는 인벤토리 값이 계산 된 값과 다른 경우에만 업데이트합니다. 따라서 모든 것이 이미 정확하다면 아무것도 업데이트되지 않습니다.
쿼리가 모두 (영수증-수요)를 추가, 가게의 초기 재고을 고려하여 재고 계산을 수행하는 서브 쿼리 (CALC)까지, 그것, 그러나 현재 기록을 포함하여
요일 시퀀스에 간격이있는 경우에도 작동합니다.
update t
set inventory = calc.inventory
from (select sku,
first_value(inventory) over (
partition by store
order by day
rows unbounded preceding)
+ sum(receipts-demand) over (
partition by store
order by day
rows unbounded preceding)
+ demand - receipts as inventory
from t) as calc
where t.sku = calc.sku
and (t.inventory is null or t.inventory <> calc.inventory);
여기는 SQL fiddle입니다.
SQL 서버 엔진이 거의 없기 때문에 나는 Postgres 엔진에서 피들을해야만했다. 그러나이 쿼리의 구문은 SQL Server (SQL:2008 호환 구문)와 동일합니다.
견고성? 강력한 질문 형식을 먼저 제공 할 수 있습니까? – icbytes
여기서 '어디에'있습니까? –
어떤 버전의 SQL Server를 사용하고 있습니까? –