【问题标题】:SQL Server 2008 and Almost-Progressive Sum and Average?SQL Server 2008 和几乎渐进式求和和平均?
【发布时间】:2010-12-14 21:29:03
【问题描述】:

我有一个包含几百万行的表,其中包含一个 ID 列和一个 DateTimeOffset 列。该表仅跟踪某些操作的已用时间。

在不触摸光标或不做 RBAR 的情况下,如何获得每行之间的差异,然后是所有行之间的平均时间?

例如,如果第 1 行是 12:00,第 2 行是 12:01,第 3 行是 12:03,那么我的结果集将有第 1 行和 0,第 2 行有 1,第 3 行有 2。然后我的下一个结果集的值为 1.5。

帮助?

谢谢。

【问题讨论】:

    标签: sql-server-2008 sum average


    【解决方案1】:

    我认为您可以通过加入行号来做到这一点,例如:

    WITH datanumbered AS (
       SELECT dateValue, ROW_NUMBER() OVER (ORDER BY dateValue) AS rownum
    )
    SELECT first.rownum, DATEDIFF(second, first.dateValue, second.dateValue) AS TimeDiff
    FROM datenumbered first
        JOIN datenumbered second ON first.rownum = second.rownum - 1
    

    然后使用上述查询作为子查询计算平均值。

    【讨论】:

      【解决方案2】:

      我假设每一行都有一个标识值?
      在表上建立一个外键关系回到它自己。

      当你插入每一行时,你给它上一行的 Fk。

      然后您可以将表连接回自身,例如

      Select row2.Offset - row1.Offset from Offsets row1 inner join Offsets row2 
      on row1.IdentityCol = row2.ForignKeyCol
      

      最后一行是

      Select avg(row2.Offset - row1.Offset) from Offsets row1 inner join Offsets row2 
      on row1.IdentityCol = row2.ForignKeyCol
      

      希望这是有道理的,对你有用
      体重

      【讨论】:

        【解决方案3】:

        假设每个标识值仅比前一个大 1,您可以使用子查询执行以下操作:

        select testdate, DATEDIFF(SECOND, TestDate, 
             (select TestDate from TestDates tdIn where tdIn.TestId = tdOut.TestId + 1))
        from TestDates tdOut
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-05-06
          • 2015-11-22
          • 2014-02-12
          • 2011-04-12
          • 1970-01-01
          • 1970-01-01
          • 2015-11-09
          相关资源
          最近更新 更多