4

日付とカウントの両方を持つ 2 つのレコードがあるとします。

--Date--                   --Count--
2011-09-20 00:00:00        5
2011-09-16 00:00:00        8

時間のギャップを埋めるためにこれをどのように選択し、常に最後の前のレコードを取得しますか?

したがって、出力は次のようになります。

--Date--                   --Count--
2011-09-20 00:00:00        5
2011-09-19 00:00:00        8
2011-09-18 00:00:00        8
2011-09-17 00:00:00        8
2011-09-16 00:00:00        8

これに対するきちんとした解決策をまだ見つけられませんでした。これは DATEDIFF と for ループで実行できると思いますが、もっと簡単に実行できることを願っています。

4

2 に答える 2

4

解決しようとしている問題が 2 つあります。そのギャップをどう埋めるかがまず課題です。2 番目の問題は、欠落しているレコードの [カウント] フィールドにデータを入力することです。

問題 1: これは、 を使用するDates Lookup tableか、 を作成することで解決できますrecursive common table expression。オプションである場合は、このための日付ルックアップ テーブルを作成することをお勧めします。そのようなテーブルを作成できない場合は、このようなものが必要になります。

WITH CTE AS (
  SELECT MAX(dt) maxdate, MIN(dt) mindate
  FROM yourtable
  ),
RecursiveCTE AS (
  SELECT mindate dtfield
  FROM CTE
  UNION ALL
  SELECT DATEADD(day, 1, dtfield)
  FROM RecursiveCTE R 
    JOIN CTE T
      ON R.dtfield < T.maxdate
  )

MINこれにより、テーブル内の日付で始まり、で終わる日付のリストが作成されますMAX

問題 2:correlated subquery元のテーブルから最後の cnt を取得するために a が便利な場所です (私は通常それらから離れています)。

SELECT r.dtfield, 
   (SELECT TOP 1 cnt
    FROM yourtable 
    WHERE dt <= r.dtfield 
    ORDER BY dt DESC) cnt
FROM RecursiveCTE r
于 2013-05-29T16:51:37.387 に答える
1

私の解決策は次のようになります。

ステップ 1: すべての日付を含む Date テーブルを作成します。- 多くのメソッドを使用できます。例: 2 つの日付の間の日付のリストを取得する

ステップ 2: 日付テーブルから結果セットへのレフト アウターを実行します。- 以下の結果セットが得られます: Call this table as "TEST_DATE_COUnt"

--Date--                   --Count--
2011-09-20 00:00:00        5
2011-09-19 00:00:00        0
2011-09-18 00:00:00        0
2011-09-17 00:00:00        0
2011-09-16 00:00:00        8

ステップ 3: 以下のような再帰クエリを実行します。

SELECT t1.date_x, t1.count_x,
   (case when count_x=0 then (SELECT max(COUNT_X)
    FROM TEST_DATE_COUNT r 
    WHERE r.DATE_X <= t1.DATE_X) 
    else COUNT_X
    end) 
    cnt
FROM TEST_DATE_COUNT t1

これがうまくいくかどうか教えてください。テストしましたが、うまくいきました。

于 2013-05-29T17:02:50.367 に答える