Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 计算查询中的值差之和_Sql_Sql Server_Count - Fatal编程技术网

Sql 计算查询中的值差之和

Sql 计算查询中的值差之和,sql,sql-server,count,Sql,Sql Server,Count,我对SQL查询有一个问题,我必须计算一个时隙中每个“范围”值之间的差异。下面是我正在尝试做的一个例子: 我有一个表,有两列数据和一个时间戳 Value Time 5 16:00 6 17:00 7 18:00 0 19:00 1 20:00 2 21:00 3 22:00 4 23:00 5 00:00 6 01:00 0 02:00 ... 我必须给出每个时

我对SQL查询有一个问题,我必须计算一个时隙中每个“范围”值之间的差异。下面是我正在尝试做的一个例子:

我有一个表,有两列数据和一个时间戳

Value   Time
5       16:00
6       17:00
7       18:00
0       19:00
1       20:00
2       21:00
3       22:00
4       23:00
5       00:00
6       01:00
0       02:00
...
我必须给出每个时隙的差值之和。这张表会给我结果8,因为你有7和5之间的差,还有6和0之间的差


我的想法是,通过分析每一行,改变找到的最小值和最大值,直到我达到0,然后计算它们之间的差值,并将结果保存在一个变量中,该变量将使用相同的逻辑进行相加,直到表的末尾,但我认为通过一个查询和相当好的表演。你能帮我解决这个问题吗?

这是一个很大的秘密,但是,它附带了一个很大的警告。您的数据中需要某种标识列。目前,我们无法按照您在样本数据中提供的顺序订购您的数据

SQL Server表中的数据存储为堆。它有顺序。运行
时,从[表]中选择*数据将以“感觉”的任何顺序从服务器返回。它可能是按照您插入它的顺序(如果它是一个小表),但是,它永远不能保证。它也可能是按照您的
聚集索引的顺序进行的,但是,它也不能保证。当您有更大的表,并且使用多个核心运行同一个查询时,这种情况变得尤其常见

对于您的数据,排序对于回答您的问题至关重要。如果我们不能通过使用这些数据来实现示例数据中的顺序,那么您的目标就无法实现

因此,为此,我已向表中添加了一列。这很可能意味着您不能追溯此日期,因为我们有办法保证
IDENTITY
列将以正确的顺序填充

不管怎么说,还是要解决这个问题。这只是一个想法,依赖于您使用SQL Server 2012以后的版本(以及我刚才提到的
IDENTITY
专栏)。但是,如果无法更改表的DDL,则无法实现目标;简单地说

USE Sandbox;
GO

CREATE TABLE #Test (ID int IDENTITY(1,1), --Note I have had to add an IDENTITY Column
                                          --Without this, your goal is not possible, as 
                                          --your ordering cannot be maintained.
                    [Value] int, [Time] time);

INSERT INTO #Test ([Value], [Time])
VALUES (5,'16:00'),
       (6,'17:00'),
       (7,'18:00'),
       (0,'19:00'),
       (1,'20:00'),
       (2,'21:00'),
       (3,'22:00'),
       (4,'23:00'),
       (5,'00:00'),
       (6,'01:00'),
       (0,'02:00');

WITH Groups AS(
    SELECT *,
           COUNT(CASE [Value] WHEN 0 THEN 0 END) OVER (ORDER BY ID ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS Grp
    FROM #Test),
FirstLast AS(
    SELECT FIRST_VALUE([Value]) OVER (PARTITION BY Grp ORDER BY ID) AS FirstValue,
           LAST_VALUE([Value]) OVER (PARTITION BY Grp ORDER BY ID ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) AS LastValue,
           ROW_NUMBER() OVER (PARTITION BY Grp ORDER BY ID) AS RN
    FROM Groups)
SELECT SUM(LastValue - FirstValue) AS TotalDifference
FROM FirstLast
WHERE RN = 1;

DROP TABLE #Test;

指定如何计算得到8,并用数字表示。我不理解你的问题。是什么导致您比较
[Value]
5(@
'16:00'
'00:00'
)和
[Value]
7(仅在
'18:00'
)。为什么这些行相互关联?还有,是什么定义了表的顺序?我们不能按
[Time]
排序,因为
'02:00'
在数据集中几乎每隔一个时间都在前面(但出现在示例数据的末尾),我们不能按
[value]
排序,因为这也会改变数据集的顺序。我们如何按照您提供的顺序从表中返回数据?时间戳只是用来过滤表的。例如,该值表示事件期间花费的分钟数,当达到目标时,该值返回0。我想知道您在一个时间段内花费了多少分钟。例如,在16:00和02:00之间,您在5和7之间有两分钟,然后它变为0,您又花费了6分钟,因此2分钟+6分钟=8分钟。时间只是每个样本数据的顺序。您好,首先感谢您的回答。我认为这正是我所寻找的,但它一直告诉我无法绑定多部分标识符。请您提供完整的错误@user2493388,好吗?事实上,这个问题是由一个内部连接造成的,为了按时间过滤样本数据,我必须进行内部连接(我不得不使问题的描述更简单,但麦加主义仍然是一样的:))。问题解决了!!真的谢谢你:)