2014-06-26 119 views
1

这可能已经在这里回答过,但我甚至不知道如何搜索它,所以如果它是重复的,我很抱歉。SQL查询的时间范围

我有一个电话表。列包括呼叫开始的时间,以秒为单位的呼叫长度和呼叫进入的“频道”(从1到4的整数)。我想知道所有4个频道被占用的频率。我如何查询这个?

例如,考虑样本数据:

CallTime Length Channel 
12:00  22  1 
12:05  15  2 
12:10  20  3 
12:15  10  4 

在这种情况下,所有4个信道分别占据7分钟(直到第一呼叫结束)。有没有办法查询这个?

感谢,

斯科特

回答

0
DECLARE @MyTable TABLE 
(
    CallTime DATETIME, 
    CallLength INT, 
    Channel INT 
) 

INSERT INTO @MyTable 
(CallTime, CallLength, Channel) 
VALUES 
('06-26-2014 12:00:00', 22, 1), 
('06-26-2014 12:00:05', 15, 2), 
('06-26-2014 12:00:10', 20, 3), 
('06-26-2014 12:00:15', 10, 4); 

DECLARE @number_of_numbers INT = 100000; 

;WITH 
a AS (SELECT 1 AS i UNION ALL SELECT 1), 
b AS (SELECT 1 AS i FROM a AS x, a AS y), 
c AS (SELECT 1 AS i FROM b AS x, b AS y), 
d AS (SELECT 1 AS i FROM c AS x, c AS y), 
e AS (SELECT 1 AS i FROM d AS x, d AS y), 
f AS (SELECT 1 AS i FROM e AS x, e AS y), 
numbers AS 
(
    SELECT TOP(@number_of_numbers) 
    ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS number 
    FROM f 
) 


SELECT 
    d.CheckTime, 
    MAX(CASE WHEN m.Channel = 1 THEN 1 ELSE 0 END) Channel1, 
    MAX(CASE WHEN m.Channel = 2 THEN 2 ELSE 0 END) Channel2, 
    MAX(CASE WHEN m.Channel = 3 THEN 3 ELSE 0 END) Channel3, 
    MAX(CASE WHEN m.Channel = 4 THEN 4 ELSE 0 END) Channel4 
FROM 
(
    SELECT DATEADD(SECOND, n.number, '06/26/2014') CheckTime 
    FROM numbers n 
) AS d 
INNER JOIN @MyTable m 
    ON d.CheckTime >= m.CallTime AND d.CheckTime <= DATEADD(SECOND, m.CallLength, m.CallTime) 
GROUP BY d.CheckTime 

在这里你创建号码表,然后用它来创建每一天的第二个时隙,那么你可以加入一个例子对你的桌子和使用组你可以找到所有活跃的渠道。

+0

感谢您的回应。我在MySQL中这样做,所以有些不解析。我试图将其转换,但我对主要逻辑不清楚。这件作品是什么?: '; WITH' 'a AS(SELECT 1 AS i UNION ALL SELECT 1),' 'b AS(SELECT 1 AS i FROM AS x,a AS y),' 'AS AS(SELECT 1 AS i FROM FROM AS x,b AS y)',' ' AS 0,ASY),' ''AS(SELECT AS AS FROM FROM AS x,e AS y)', ' ()OVER(ORDER BY(SELECT NULL))AS号码' 'FROM f' ')' – genevish

+0

刚刚创建一个数字表,这里是一些数字表代码为mysql:http://stackoverflow.com/qu estions/9751318 /创建-A-数表,在MySQL的 –