次の表の表があります。
----------------------------------
Hour Location Stock
----------------------------------
6 2000 20
9 2000 24
----------------------------------
したがって、これは、数量に変化がある時間の一部に対する在庫を示しています。ここでの私の要件は、このテーブルにデータを仮想的に表示するビューを作成することです(在庫が特定の時間停止していない場合)。したがって、表示する必要のあるデータは次のとおりです。
----------------------------------
Hour Location Stock
----------------------------------
6 2000 20
7 2000 20 -- same as hour 6 stock
8 2000 20 -- same as hour 6 stock
9 2000 24
----------------------------------
つまり、データが特定の1時間存在しない場合でも、在庫がある最後の1時間の在庫を表示する必要があります。そして、私は列に1から23までのすべての利用可能な時間を含む別のテーブルを持っています。
以下の方法でパーティションオーバーを試みました。しかし、私は私の要件を達成するためにこれの周りにいくつかのことが欠けていると思います。
SELECT
HOUR_NUMBER,
CASE WHEN TOTAL_STOCK IS NULL
THEN SUM(TOTAL_STOCK)
OVER (
PARTITION BY LOCATION
ORDER BY CURRENT_HOUR ROWS 1 PRECEDING
)
ELSE
TOTAL_STOCK
END AS FULL_STOCK
FROM
(
SELECT HOUR_NUMBER AS HOUR_NUMBER
FROM HOURS_TABLE -- REFEERENCE TABLE WITH HOURS FROM 1-23
GROUP BY 1
) HOURS_REF
LEFT OUTER JOIN
(
SEL CURRENT_HOUR AS CURRENT_HOUR
, STOCK AS TOTAL_STOCK
,LOCATION AS LOCATION
FROM STOCK_TABLE
WHERE STOCK<>0
) STOCKS
ON HOURS_REF.HOUR_NUMBER = STOCKS.CURRENT_HOUR
このクエリは、データのない時間について、在庫のあるすべての時間をnullとして与えています。Teradataなどのデータベースで使用できるようにANSISQLソリューションを検討しています。
パーティションを間違って使用していると思いますが、他の方法はありますか。CASE WHENで試してみましたが、在庫を1時間確認するには、何らかのループが必要です。