次のようなカードのテーブルと(カード上の)動きのテーブルがあります。
declare @cards table
(
id_card int,
cycle int
)
insert into @cards (id_card, cycle) values (1, 10)
declare @moves table
(
id_move int,
id_card int,
quantity int
)
insert into @moves (id_move, id_card, quantity) values (1, 1, 2)
insert into @moves (id_move, id_card, quantity) values (2, 1, 4)
insert into @moves (id_move, id_card, quantity) values (3, 1, 2)
insert into @moves (id_move, id_card, quantity) values (4, 1, 8)
insert into @moves (id_move, id_card, quantity) values (5, 1, 2)
問題: 各カードにはサイクル サイズがあり、各移動には数量があります。したがって、カード サイクル サイズ 10 と 18 の移動は、1 つのフル サイクルに加えて 8 移動を意味します。最後のサイクルの最初の移動 (この例では移動 ID 4) を見つける必要があります。この問題は (最初は) 些細なことのように思えますが、動きを見つけるのに非常に多くのトラブルが発生しているため、何か非常に間違ったことをしていると思います。
最後のサイクルの最初の動きの開始位置を示すクエリを思いつきましたが、そこからどこにも行けません。
select
id_card,
case
when value > quantity then value - quantity
else value
end value
from
(
select
f.id_card,
f.quantity,
f.quantity - f.quantity % cards.cycle + 1 value
from
(
select
id_card,
sum(quantity) quantity
from @moves
group by
id_card
) f
join @cards cards on
cards.id_card = f.id_card
) f
期待される出力:
id_move
4
何か案は?問題を簡単にするために変更を加えることができます。