【问题标题】:Get gas consumption from cumulative data从累积数据中获取耗气量
【发布时间】:2015-08-31 23:13:26
【问题描述】:

这是我在这里的第一篇文章! 我正在处理这个查询一段时间,我真的需要你的帮助。

我有两张桌子

Counters
=============   
ID  Description
-------------------
1   GasCounter1
2   GasCounter2

Measurements
================
ID  TimeStamp              ValCum   CounterID
----------------------------------------------
1   01.01.2015 00:00:00    1        1
2   01.01.2015 00:15:00    2        1
3   01.01.2015 00:30:00    3        1
4   01.01.2015 00:45:00    4        1
---------------------------------------
5   01.01.2015 01:00:00    5        1
6   01.01.2015 01:15:00    6        1
7   01.01.2015 01:30:00    7        1
8   01.01.2015 01:45:00    8        1
---------------------------------------
9   01.01.2015 02:00:00    9        1
10  01.01.2015 02:15:00    10       1
11  01.01.2015 02:30:00    11       1
12  01.01.2015 02:45:00    12       1
---------------------------------------
13  01.01.2015 03:00:00    13       1
14  01.01.2015 03:15:00    14       1
15  01.01.2015 03:30:00    15       1
16  01.01.2015 03:45:00    16       1
---------------------------------------
17  01.01.2015 04:00:00    17       1
18  01.01.2015 04:15:00    18       1
19  01.01.2015 04:30:00    19       1
20  01.01.2015 04:45:00    20       1

.... Here are data only for GasCounter1

ValueCum 是从 GasCounters 读取的累积消耗

我需要计算每小时的气体消耗量(从选定的时间间隔开始) 在此示例中,所有消耗都是 4

1->2 = 1 +
2->3 = 1 +
3->4 = 1 +
4->5 = 1 = ===> 4

5->6 = 1
6->7 = 1
7->8 = 1
8->9 = 1 ===> 4

如果实际数据是:

5->6 = 1
6->7 = 1
7->9 = 2
9->12 = 3 ===> 7

好吧,我尝试使用 Group by --> 我可以计算组总和,但这是错误的。 当我在谷歌搜索时,我找到了running totalcumulative sum的一些解决方案,但这正好与我需要的相反。

我已经有累积值 -> 我需要两者之间的差异:

last record in **previous** group and 
last record inside current group

我希望我清楚这个问题。 感谢您的帮助

【问题讨论】:

    标签: sql sql-server calc consumption


    【解决方案1】:

    如果我的问题正确,也许这就是你要找的东西。

    -- Generate demo data
    CREATE TABLE #measure(id int identity(1,1), [TimeStamp] datetime, valcum int, counterid int)
    
    INSERT INTO #measure(TimeStamp, valcum, counterid)
    VALUES  (DATEADD(hour,-3,GETDATE()),1,1), (DATEADD(hour,-3,GETDATE()),2,1), (DATEADD(hour,-3,GETDATE()),1,1), (DATEADD(hour,-3,GETDATE()),2,1),
            (DATEADD(hour,-2,GETDATE()),8,1), (DATEADD(hour,-2,GETDATE()),1,1), (DATEADD(hour,-2,GETDATE()),8,1), (DATEADD(hour,-2,GETDATE()),1,1), 
            (DATEADD(hour,-1,GETDATE()),3,1), (DATEADD(hour,-1,GETDATE()),1,1), (DATEADD(hour,-1,GETDATE()),3,1), (DATEADD(hour,-1,GETDATE()),1,1),
            (GETDATE(),2,1), (GETDATE(),1,1), (GETDATE(),10,1), (GETDATE(),2,1), (GETDATE(),1,1), (GETDATE(),10,1)
    
    -- Show demo data
    SELECT *
    FROM #measure
    
    -- Sum every value grouped per date and hour.
    ;WITH data AS(
        SELECT id, TimeStamp, valcum, counterid, 
            SUM(valcum) OVER (PARTITION BY  CONVERT(date, m.timestamp), DATEPART(hour, m.TimeStamp)) as sumVal,
            DENSE_RANK() OVER (ORDER BY CONVERT(date, m.timestamp), DATEPART(hour, m.TimeStamp)) as package,
            ROW_NUMBER() OVER (PARTITION BY  CONVERT(date, m.timestamp), DATEPART(hour, m.TimeStamp) ORDER BY id) as numberInPackage
        FROM #measure as m
    )
    SELECT *, d1.valcum - d2.valcum as diff
    FROM data as d1
    LEFT JOIN data as d2
            ON d1.package-1 = d2.package
    WHERE d1.numberInPackage = 4 and d2.numberInPackage = 4
    
    
    -- Cleanup
    DROP TABLE #measure
    

    【讨论】:

    • 此代码返回与 group by 相同的结果,但这不是我需要的
    • 嗯,好的。我明白你的意思。但这取决于你的版本? SQL Server 2008 还是 2012/2014?
    • 我需要总结行之间的差异。正如我在上面的示例中所写:5 m3/h --> 6 m3/h = 每 15 分钟有 1 m3/h 气体消耗...现在我们需要对消耗求和而不是 累积值 .
    • 目前我使用 2008 -> 但最终会升级 2012/2014。任一版本的解决方案都很好
    • 如果您尝试跟踪您的水/电消耗,该系统实际上就是您在家中所做的。您将记下计数器的当前值(累积)。您将在第二天重复,下一个,... 现在您获得了 *** 累积读数 ***,但您需要按天计算(例如)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多