1

我希望我能解释这一点。

对于不同的业务对象,我有各种基于时间的读数。每个读数都有一个时间戳和一个值。每个业务对象的数据开始的实际时间对于每个对象是不同的。(即对象 1 的数据首次记录在 6 月,对象 2 的数据首次记录在 8 月)

我需要做的是根据读数的顺序(第一个值,第二个值)聚合(总和,平均值等)不同对象之间的值,而不考虑每个值的实际时间

所有数据点代表每个月的一个值。所以业务对象之间不存在匹配问题。每个业务对象的第二个值比第一个值晚一个月,等等。这些值的时间戳具有该月的最后一天,但这对数据的性质没有意义。年份和月份很重要。

我一直在通过为每个业务对象加载整组数据并通过代码合并数据来处理这个问题。但我想知道是否有办法通过 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

我的数学在第 3 个月的 mny 示例中不正确。这就是我得到的

 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。必须让这三个方面都发生一些事情。我会尝试你的方法,看看它的兼容性如何。

于 2012-10-22T14:42:40.890 回答
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 回答