Sql 计算查询中的值差之和
我对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 ... 我必须给出每个时
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,好吗?事实上,这个问题是由一个内部连接造成的,为了按时间过滤样本数据,我必须进行内部连接(我不得不使问题的描述更简单,但麦加主义仍然是一样的:))。问题解决了!!真的谢谢你:)