3

さまざまな日付のさまざまな商品の価格を格納するデータのテーブルがあります。

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
4

2 に答える 2

2

CROSS APPLY を使用できます。少し速いかもしれませんが、この場合はおそらく目立たないでしょう:

SELECT mr1.market_date
    ,mr1.close_value as close_value_1
    ,p.close_value as close_value_2
FROM commodities mr1
cross apply
  (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) p
  WHERE mr1.the_type = 1

実際に見る

于 2013-07-04T16:05:50.917 に答える
1
WITH OrderedOrders AS
(
    SELECT mr1.market_date
          ,mr1.close_value as mr1close
          ,mr2.close_value as mr2close
          ,ROW_NUMBER() OVER (PARTITION BY mr1.market_date ORDER BY mr2.market_date desc) AS RowNumber
    FROM commodities mr1
    JOIN commodities mr2
      ON mr2.market_date <= mr1.market_date
     AND mr2.the_type = 2
     AND mr1.the_type = 1 
)  
SELECT market_date, mr1close, mr2close  
FROM OrderedOrders 
WHERE RowNumber = 1
于 2013-07-04T15:44:39.690 に答える