1

SQL でのリクエストに問題があります。

2 つのテーブルがあります。1 つは日付のベクトルを表し、もう 1 つはさまざまな証券の価格の時系列を表します。

日付:

日付ID 日にち
1 2021-01-01
2 2021-01-02
3 2021-01-03

時系列:

セキュリティ ID 日付ID 価値
1 1 0.25
1 3 0.32
2 1 0.41
2 2 0.67

timeseries にはギャップがある場合があります。たとえば、上記のテーブルでは、SecurityId=1 には DateId=2 に行がなく、SecurityId=2 には DateId=3 に行がありません。

timeseries の直前の値でギャップを埋めるリクエストを作成する必要があります。すべての証券とすべての日付の値は次のようになります。

セキュリティ ID 日付ID 価値
1 1 0.25
1 2 0.25
1 3 0.32
2 1 0.41
2 2 0.67
2 3 0.67

すべての日付を右結合で一致させようとしました

 SELECT  * from [TimeSerie] px RIGHT JOIN Dates dt on dt.DateId = px.Dateid

残念ながら、DateId の等価性が一致するセキュリティが常に存在するため、これは機能しません。そのため、値のない TimeSeries 行を取得できません。

私はSQL Server標準2019に取り組んでおり、単一のクエリに基づくソリューションを目指しています(一時テーブルまたはカーソルを使用した手順を回避します)。

4

2 に答える 2

3

を使用cross joinして行を生成し、次のことを行うことができますleft join

select d.*, s.*, ts.value
from dates d cross join
     (select distinct securityid from timeseries) s left join
     (select ts.*,
             lead(ts.dateid) over (partition by securityid order by dateid) as next_dateid
      from timeseries ts
     ) ts
     on s.securityid = ts.securityid and
        d.dateid >= ts.dateid and
        (d.dateid < ts.next_dateid or ts.next_dateid is null);

これは、dateids が連続していることを前提としていますが、これは合理的な前提のようです。

于 2021-03-10T15:23:03.903 に答える