2

参加する必要がありますが、どのタイプかわかりません。次のようなテーブルがあります。

Date        Amount | FOO
------------------
2012-01-12       x
2012-03-14       y
2012-05-06       z
2012-05-14      aa
2012-09-02      bb

私はこれを DateDim (Google here: DATE DIM、日付の表 (過去と未来)) と結合しています。

次のようなデータを表示するクエリが必要です。

datedim.Date    foo.Amount | FOO x DATEDIM
------------------------------------------
2012-01-12               x
2012-01-13               x
2012-01-14               x
... etc...
2012-03-14               y
2012-03-15               y
2012-03-16               y
2012-03-17               y
... etc...
2012-05-06               z
... etc...

基本的に、次の非 null 値まで値を保持する必要があります (左結合の場合は NULL になります)。それも持続します...など..


私がこれまでに持っているもの...

SELECT datedim.Date
    ,CASE
        WHEN Amount IS NULL
        THEN (SELECT TOP 1 Amount
        FROM FOO WHERE foo.Date <= datedim.Date
        ORDER BY Date DESC)
        ELSE Amount END AS Amount
FROM DATEDIM datedim
LEFT JOIN FOO foo
ON foo.Date = datedim.Date

これからビューを作成する必要があります。TOPで指定されていない限り、ORDER BYはビューに対して無効であるというエラーが表示されます??? サブクエリにTOPがあります...

4

2 に答える 2

1

CTEまたはウィンドウ関数を使用するより効率的な方法があると確信していますが、これらの線に沿った何かが機能するはずです:

Select
  d.Date,
  d.FooDate,
  f.Amount
From
  Foo f
    Inner Join (
    Select
      d.[Date],
      Max(f.[Date]) as FooDate
    From
      Foo f
       Inner Join
      DateDim d
        On f.[Date] < d.[Date]
    Group By
      d.[Date]
  ) d 
  On d.[FooDate] = f.[Date]

http://sqlfiddle.com/#!3/3c7d5/10

于 2012-11-19T23:19:12.147 に答える
1

SQLServer2005+ では、再帰 CTE を使用します

;WITH cte (id, [Date], Amount) AS
 (
  SELECT ROW_NUMBER() OVER (ORDER BY [Date] ASC) AS id,
         [Date], Amount
  FROM dbo.your_table t1
  ), cte2 (id, [Date], [LevelDate], Amount) AS
 (         
  SELECT c1.id, c1.[Date], DATEDIFF(day, c1.[Date], c2.[Date]) AS [LevelDate], c1.Amount
  FROM cte c1 LEFT JOIN cte c2 ON c1.id = c2.id - 1
  ), cte3 (id, [Date], Amount, [Level]) AS
 (
  SELECT  id, [Date], Amount, 1 AS [Level]
  FROM cte2 c
  UNION ALL
  SELECT c.id, DATEADD(day, 1, ct.[Date]) AS [Date], c.Amount, ct.[Level] + 1
  FROM cte2 c JOIN cte3 ct ON c.id = ct.id
  WHERE c.[LevelDate] > ct.[Level]
  )
  SELECT [Date], Amount
  FROM cte3
  ORDER BY Date
  OPTION (maxrecursion 0)

SQLFiddle のデモ

于 2012-11-20T01:03:53.650 に答える