さまざまな日付のさまざまな商品の価格を格納するデータのテーブルがあります。
CREATE TABLE COMMODITIES(
[MARKET_DATE] [datetime2](0) NOT NULL,
[THE_TYPE] [numeric](2, 0) NOT NULL,
[CLOSE_VALUE] [numeric](10, 4) NULL,
) ON [PRIMARY]
GO
MARKET_DATE
取引日を保持します (日付は昇順ですが、連続していません)
CLOSE_VALUE
価格を保持します
THE_TYPE
商品の種類を保持します。
商品ごとに取引日が異なります。
=1 のすべての日付と価格、および=2THE_TYPE
の商品の対応する価格のリストを取得する必要があります。THE_TYPE
各商品の取引日が同じである場合、単純な結合を行うことができます (ExcelVLOOKUP (, false)
SELECT mr1.market_date
,mr1.close_value,mr2.close_value
FROM commodities mr1
LEFT JOIN commodities mr2 ON mr1.market_date = mr2.market_date
AND mr2.the_type = 2
WHERE mr1.the_type = 1
ただし、取引日が同じではないため、Excel に相当する正確ではない一致を探す必要があります。VLOOKUP (, true)
つまり、その日付mr2
またはそれ以前の最大日付です。mr1.market_date
私はきちんとした解決策を探しています。回避策として、その間の日付をデータベースに入力すると機能します。または、代わりに次のこともできます
SELECT mr1.market_date
,mr1.close_value
,
(SELECT top 1 close_value
FROM commodities mr2
where mr2.market_date <= mr1.market_date
AND mr2.the_type = 2
order by market_date desc
) AS close_value
FROM commodities mr1
WHERE mr1.the_type = 1
しかし、よりきちんとした(そしてより迅速な)解決策があることを願っています
例として、テーブルに次のものが保持されている場合
MARKET_DATE CLOSE_VALUE THE_TYPE
2012-01-01 300 1
2012-01-03 310 1
2012-01-05 310 1
2012-01-01 400 2
2012-01-02 420 2
2012-01-05 430 2
私は得るだろう
2012-01-01 300 400
2012-01-03 310 420
2012-01-05 310 430