1

これについて説明できればと思います。

私は、さまざまなビジネス オブジェクトに対してさまざまな時間ベースの測定値を持っています。各読み取りには、タイムスタンプと値があります。各ビジネス オブジェクトのデータが開始される実際の時間は、オブジェクトごとに異なります。(つまり、オブジェクト 1 のデータは 6 月に最初に記録され、オブジェクト 2 のデータは 8 月に最初に記録されました)

私がする必要があるのは、各値が実際にあった時間に関係なく、読み取り値の順序 (最初の値、2 番目の値) に基づいて、さまざまなオブジェクト間の値を集計 (合計、平均など) することです。

すべてのデータ ポイントは、各月の 1 つの値を表します。したがって、ビジネス オブジェクト間のマッチングの問題はありません。各ビジネス オブジェクトの 2 番目の値は、最初の値よりも 1 か月遅れています。などなど。値のタイムスタンプには月の最終日がありますが、これはデータの性質上意味がありません。年と月が重要です。

私は、各ビジネス オブジェクトのデータ セット全体をロードし、データをマージするコードを使用して、これに対処してきました。しかし、SOL経由でこれを行う方法があるかどうか疑問に思っています.

誰かがアイデアを得ましたか?

ここにいくつかのデータがあります これはデータがどのように見えるかです

object ID   Date           Value
1           2010-01-31      1.0
1           2010-03-31      2.0
1           2010-04-30      3.0
2           2011-06-30     10.0
2           2011-07-31     11.0
2           2011-08-31     12.0

望ましい結果は

month    Sum     Average
1        11.0     5.5
2        11.0    11.0 (there is no second month for the first object)
3        13.0     6.5
4         3.0     3.0 (there is no fourth month for the second object)
4

3 に答える 3

0

新しいサンプル データを使用した場合の解決策は次のとおりです。

;WITH PREPARED_DATA 
     AS (SELECT *, 
                Datediff(MONTH, Min(DATE) OVER (PARTITION BY ID), DATE) 
                + 1 MONTH
         FROM   DATA_TABLE) 
SELECT MONTH, 
       Sum(VALUE) AS SUM_VALUE, 
       Avg(VALUE) AS AVG_VALUE 
FROM   PREPARED_DATA 
GROUP  BY MONTH

ここで実際の例を見つけることができます。

于 2012-10-17T14:04:24.000 に答える
0
WITH M AS (
SELECT [Object ID]
     , MIN([Date]) as [Date]
  FROM TBL
 GROUP BY [Object ID]
)
SELECT DATEDIFF(MONTH,M.[Date], D.[Date]) + 1 AS [MONTH]
     , SUM(VALUE) AS [SUM]
     , AVG(VALUE) AS [AVERAGE]
  FROM TBL D
 INNER JOIN M
    ON D.[Object ID] = m.[Object ID]
 GROUP BY DATEDIFF(MONTH,M.[Date], D.[Date])

クエリが間違っているか、3か月目の数学が間違っています。

于 2012-10-20T19:55:37.390 に答える
0

私の数学は、3 か月目の多くの例で外れていました。これが私が得たものです。

 select sum (value), dataorder + 1 
    from  (select normaldata.value,
          ((year(NormalData.DATE) - 1900) * 12) + MONTH(normaldata.date) - mintab.Mindate AS DataOrder from NormalData, (select ObjectId,
 Min(((year(date) - 1900 )* 12) + MONTH(DATE)) as Mindate from
 NormalData group by ObjectID) as MINtab where (NormalData.ObjectID =
 mintab.ObjectID)
      ) AS OrderedData group by DataOrder

これは Access と SQL Server では機能しますが、Oracle では機能しません。3つすべてで何かを起こさなければなりません。私はあなたのアプローチを試して、それがどれほど互換性があるかを確認します。

于 2012-10-22T14:42:40.890 に答える