私は簡単なテーブルを持っています:
prices(fromwhichweek(int),newprice(int))
data example:
1,20
3,21
10,30
だから私は毎週の価格を返すSQLステートメントを探していますか?
次のようなもの(上記の3行による):
1,20
2,20
3,21
4,21
5,21
6,21
7,21
8,21
9,21
10,30
...
私は簡単なテーブルを持っています:
prices(fromwhichweek(int),newprice(int))
data example:
1,20
3,21
10,30
だから私は毎週の価格を返すSQLステートメントを探していますか?
次のようなもの(上記の3行による):
1,20
2,20
3,21
4,21
5,21
6,21
7,21
8,21
9,21
10,30
...
一連の週を生成する必要があります。select
次のバージョンは、ステートメントで相関サブクエリを使用して価格を取得します。
select w.week,
(select top 1 newprice from prices p where w.week >= p.fromwhichweek
order by fromwhichweek desc
) theprice
from (select 1 as week union all select 2 union all select 3 union all select 4 union all
select 5 union all select 6 union all select 7 union all select 8 union all
select 9 union all select 10
) w
いくつかのコメント。これは、週のリストがあるかどうかによって異なります。ここでは、明示的なサブクエリを使用して実行されます。データベースに応じて、他の方法があります。
fromwhichweek
表の最大値に基づいて、動的に必要な週数を決定する方法は次のとおりです。@end
を使用する代わりに、値を明示的に割り当てる(たとえば、22または25で試す)ことにより、それを超えて拡張できますMAX
。価格表が本当にこれほど単純であると仮定すると、これは52週間でOKにスケーリングするはずです。
DECLARE @prices TABLE(fromwhichweek INT, newprice INT);
INSERT @prices VALUES
(1, 20),
(3, 21),
(10,30);
DECLARE @start INT, @end INT;
SELECT @start = MIN(fromwhichweek),
@end = MAX(fromwhichweek)
FROM @prices;
;WITH x AS
(
SELECT TOP (@end-@start+1)
n = @start-1+ROW_NUMBER() OVER (ORDER BY [object_id])
FROM sys.all_objects ORDER BY [object_id]
)
SELECT fromwhichweek = x.n,
newprice = COALESCE(p.newprice, (
SELECT TOP (1) newprice FROM @prices
WHERE fromwhichweek <= x.n
AND newprice IS NOT NULL
ORDER BY fromwhichweek DESC))
FROM x
LEFT OUTER JOIN @prices AS p
ON x.n = p.fromwhichweek
ORDER BY x.n;
これにより、希望どおりの出力が得られます。別の何かが必要な場合は、質問を変更してください:)
SELECT
fromwhichweek, price
FROM
prices
ORDER BY
fromwhichweek ASC
1〜52週間のテーブルを作成できます。
create table weeks (week int);
insert into weeks values (1), (2), ....(52);
次に、次のクエリを実行して結果を取得できます。これはネイティブのMYSQLクエリです。別のSQLベンダーを使用している場合は、少し変更する必要があります。
select A.week, B.price from weeks as A, prices as B where
B.fromwhichweek = (select C.fromwhichweek from prices as C where
C.fromwhichweek <= A.week order by C.fromwhichweek desc limit 1);