添加未记录数据的空白行以适应模式
Adding blank rows where data hasn't been recorded to fit pattern
我正在考虑做一些关于员工安排的报告,并且需要构建一个图表来显示在 15 分钟的时间间隔内有多少呼叫通过,但还需要在 0 个呼叫通过时显示。
我的主要问题是原始数据来自 phone 系统,该系统仅在收到呼叫时才写入一行。我没问题将数据分成 15 分钟的间隔,但我需要填写空白。
例如,呼叫通过:
- 06:45
- 07:15
- 07:30
但 07:00 没有电话接通。我需要能够为这个时间戳记入一个条目,以便在将其放入图表中时,它可以明显地显示当时有 0 个呼叫通过。
我创建了一个 table,一天中每 15 分钟间隔一次 - 96 行
我强制加入
- 与现有时间间隔不匹配的行,在本例中为 07:00,显示为空,
- 总共 96 行,3 行匹配,93 行显示为完全空值。 (我只添加了上面提供的 3 个测试行作为示例调用)
我的主要目标是,对于数据集的每 15 分钟间隔,即使没有调用,因此没有在一个 table 上输入行,我仍然需要显示 15 分钟间隔。
我对每 15 分钟拆分一次的 SQL 没有意见,所以我认为不值得在这里发布 SQL,因为我认为它更像是一个对象问题。
任何帮助都很棒!
我拆分 15 分钟后来自原始数据库的示例行:
Date NumberOfCalls TransInterval
25/11/2015 1 06:45
25/11/2015 1 07:15
25/11/2015 1 07:30
25/11/2015 1 07:45
25/11/2015 1 08:00
拆分使用:
SELECT ALL CONVERT(varchar, start_time, 103) AS Date
, COUNT(irn) AS NumberOfCalls
, DATEPART(Year, start_time) AS TransactionYear
, DATEPART(MONTH, start_time) AS TransactionMonth
, DATEPART(DAY, start_time) AS TransactionDate
, DATEPART(Hour, start_time) AS TransactionHour
, DATEPART(Minute, start_time) / 15 AS TransactionInterval
, CONVERT(Varchar, DATEPART(Hour, start_time))
+ CASE DatePart(Minute, [start_time]) / 15
WHEN 0 THEN ':00'
WHEN 1 THEN ':15'
WHEN 2 THEN ':30'
WHEN 3 THEN ':45' END AS TransInterval
FROM dbo.callsdbase
WHERE start_time > '2015-11-25 00:00:00'
AND start_time < '2015-11-25 23:59:59'
GROUP BY DATEPART(Year, start_time)
, DATEPART(MONTH, start_time)
, DATEPART(DAY, start_time)
, DATEPART(Hour, start_time)
, DATEPART(Minute, start_time) / 15
, start_time
ORDER BY date, transactionyear, TransactionMonth
, transactiondate, transactionhour, TransactionInterval
我已经删除了多余的列,例如 datepart year/month/date/hour 等
我的梦想:
**25/11/2015 0 06:30**
25/11/2015 1 06:45
**25/11/2015 0 07:00**
25/11/2015 1 07:15
25/11/2015 1 07:30
25/11/2015 1 07:45
25/11/2015 1 08:00
我创建的间隔 table 我尝试加入 - 只有 1 列:
06:30
06:45
07:00
07:15
07:30
07:45
08:00
我知道我需要在某个阶段 link 的日期,但我只是想先 link 几个时间间隔。
当我 link 跨越没有 0 的数据进入区间 table 并使用强制右/全外连接时发生的情况的示例:
Date NrOfCalls TYear TMonth TDate THour TInterval TransInterval Expr1
2015-11-25 1 2015 11 25 6 3 06:45 06:45
2015-11-25 1 2015 11 25 7 1 07:15 07:15
2015-11-25 1 2015 11 25 7 2 07:30 07:30
NULL NULL NULL NULL NULL NULL NULL NULL NULL
NULL NULL NULL NULL NULL NULL NULL NULL NULL
以上类作品
- 我有 96 0:15 分钟间隔,
- 结果是 96 行,93 行完全为空,
- 但最后一列不应为空,它应该在 3 个匹配行周围从 00:15 到 23:45...
是否可以将每 15 分钟的总调用次数写入您的数据库?
你可以使用两个数据点之间的导数来计算增量。
在关于 Generating a series of dates 的问题中,您会找到一种生成一系列具有给定间隔的日期的方法。
您可以 LEFT JOIN
您的数据与生成的序列以获得所有需要的时间,即使您的数据中没有相应的条目。
这样的事情怎么样
CREATE TABLE #Calls (id int
, CallStart datetime
, CallDuration int -- in seconds
, EmployeeName nvarchar(35) COLLATE SQL_Latin1_General_CP1_CS_AS);
CREATE TABLE #Timeslots (id int
, TimeSlotLower datetime
, TimeSlotUpper datetime);
现在我们输入一些测试数据
INSERT INTO #Calls (id, CallStart, CallDuration, EmployeeName) VALUES
(1, '2016-07-18 07:00:02', 150, 'John'),
(2, '2016-07-18 07:07:35', 450, 'John'),
(3, '2016-07-18 07:01:01', 70, 'Anne'),
(4, '2016-07-18 07:14:59', 350, 'Bob'), -- no calls between 7:15 and 7:30
(5, '2016-07-18 07:30:01', 91, 'John'),
(6, '2016-07-18 07:32:27', 470, 'Anne'),
(7, '2016-07-18 07:44:48', 350, 'Bob');
INSERT INTO #Timeslots (id, TimeSlotLower, TimeSlotUpper) VALUES
(1, '2016-07-18 07:00:00', '2016-07-18 07:14:59'),
(1, '2016-07-18 07:15:00', '2016-07-18 07:29:59'),
(1, '2016-07-18 07:30:00', '2016-07-18 07:44:59'),
(1, '2016-07-18 07:45:00', '2016-07-18 07:59:59'),
(1, '2016-07-18 08:00:00', '2016-07-18 08:14:59');
最后我们连接两个表
SELECT c.EmployeeName, Avg(c.CallDuration) as CallDuration_Avg
, Count(c.id) as NumberOfCalls
, t.TimeSlotLower, t.TimeSlotUpper
FROM #Timeslots t
LEFT JOIN #Calls c
ON t.TimeSlotLower <= c.CallStart
AND c.CallStart <= t.TimeSlotUpper
Group By c.EmployeeName, t.TimeSlotLower, t.TimeSlotUpper
ORDER By t.TimeSlotLower
结果是这样的
我正在考虑做一些关于员工安排的报告,并且需要构建一个图表来显示在 15 分钟的时间间隔内有多少呼叫通过,但还需要在 0 个呼叫通过时显示。
我的主要问题是原始数据来自 phone 系统,该系统仅在收到呼叫时才写入一行。我没问题将数据分成 15 分钟的间隔,但我需要填写空白。
例如,呼叫通过:
- 06:45
- 07:15
- 07:30
但 07:00 没有电话接通。我需要能够为这个时间戳记入一个条目,以便在将其放入图表中时,它可以明显地显示当时有 0 个呼叫通过。
我创建了一个 table,一天中每 15 分钟间隔一次 - 96 行 我强制加入
- 与现有时间间隔不匹配的行,在本例中为 07:00,显示为空,
- 总共 96 行,3 行匹配,93 行显示为完全空值。 (我只添加了上面提供的 3 个测试行作为示例调用)
我的主要目标是,对于数据集的每 15 分钟间隔,即使没有调用,因此没有在一个 table 上输入行,我仍然需要显示 15 分钟间隔。
我对每 15 分钟拆分一次的 SQL 没有意见,所以我认为不值得在这里发布 SQL,因为我认为它更像是一个对象问题。
任何帮助都很棒!
我拆分 15 分钟后来自原始数据库的示例行:
Date NumberOfCalls TransInterval
25/11/2015 1 06:45
25/11/2015 1 07:15
25/11/2015 1 07:30
25/11/2015 1 07:45
25/11/2015 1 08:00
拆分使用:
SELECT ALL CONVERT(varchar, start_time, 103) AS Date
, COUNT(irn) AS NumberOfCalls
, DATEPART(Year, start_time) AS TransactionYear
, DATEPART(MONTH, start_time) AS TransactionMonth
, DATEPART(DAY, start_time) AS TransactionDate
, DATEPART(Hour, start_time) AS TransactionHour
, DATEPART(Minute, start_time) / 15 AS TransactionInterval
, CONVERT(Varchar, DATEPART(Hour, start_time))
+ CASE DatePart(Minute, [start_time]) / 15
WHEN 0 THEN ':00'
WHEN 1 THEN ':15'
WHEN 2 THEN ':30'
WHEN 3 THEN ':45' END AS TransInterval
FROM dbo.callsdbase
WHERE start_time > '2015-11-25 00:00:00'
AND start_time < '2015-11-25 23:59:59'
GROUP BY DATEPART(Year, start_time)
, DATEPART(MONTH, start_time)
, DATEPART(DAY, start_time)
, DATEPART(Hour, start_time)
, DATEPART(Minute, start_time) / 15
, start_time
ORDER BY date, transactionyear, TransactionMonth
, transactiondate, transactionhour, TransactionInterval
我已经删除了多余的列,例如 datepart year/month/date/hour 等
我的梦想:
**25/11/2015 0 06:30**
25/11/2015 1 06:45
**25/11/2015 0 07:00**
25/11/2015 1 07:15
25/11/2015 1 07:30
25/11/2015 1 07:45
25/11/2015 1 08:00
我创建的间隔 table 我尝试加入 - 只有 1 列:
06:30
06:45
07:00
07:15
07:30
07:45
08:00
我知道我需要在某个阶段 link 的日期,但我只是想先 link 几个时间间隔。
当我 link 跨越没有 0 的数据进入区间 table 并使用强制右/全外连接时发生的情况的示例:
Date NrOfCalls TYear TMonth TDate THour TInterval TransInterval Expr1
2015-11-25 1 2015 11 25 6 3 06:45 06:45
2015-11-25 1 2015 11 25 7 1 07:15 07:15
2015-11-25 1 2015 11 25 7 2 07:30 07:30
NULL NULL NULL NULL NULL NULL NULL NULL NULL
NULL NULL NULL NULL NULL NULL NULL NULL NULL
以上类作品
- 我有 96 0:15 分钟间隔,
- 结果是 96 行,93 行完全为空,
- 但最后一列不应为空,它应该在 3 个匹配行周围从 00:15 到 23:45...
是否可以将每 15 分钟的总调用次数写入您的数据库?
你可以使用两个数据点之间的导数来计算增量。
在关于 Generating a series of dates 的问题中,您会找到一种生成一系列具有给定间隔的日期的方法。
您可以 LEFT JOIN
您的数据与生成的序列以获得所有需要的时间,即使您的数据中没有相应的条目。
这样的事情怎么样
CREATE TABLE #Calls (id int
, CallStart datetime
, CallDuration int -- in seconds
, EmployeeName nvarchar(35) COLLATE SQL_Latin1_General_CP1_CS_AS);
CREATE TABLE #Timeslots (id int
, TimeSlotLower datetime
, TimeSlotUpper datetime);
现在我们输入一些测试数据
INSERT INTO #Calls (id, CallStart, CallDuration, EmployeeName) VALUES
(1, '2016-07-18 07:00:02', 150, 'John'),
(2, '2016-07-18 07:07:35', 450, 'John'),
(3, '2016-07-18 07:01:01', 70, 'Anne'),
(4, '2016-07-18 07:14:59', 350, 'Bob'), -- no calls between 7:15 and 7:30
(5, '2016-07-18 07:30:01', 91, 'John'),
(6, '2016-07-18 07:32:27', 470, 'Anne'),
(7, '2016-07-18 07:44:48', 350, 'Bob');
INSERT INTO #Timeslots (id, TimeSlotLower, TimeSlotUpper) VALUES
(1, '2016-07-18 07:00:00', '2016-07-18 07:14:59'),
(1, '2016-07-18 07:15:00', '2016-07-18 07:29:59'),
(1, '2016-07-18 07:30:00', '2016-07-18 07:44:59'),
(1, '2016-07-18 07:45:00', '2016-07-18 07:59:59'),
(1, '2016-07-18 08:00:00', '2016-07-18 08:14:59');
最后我们连接两个表
SELECT c.EmployeeName, Avg(c.CallDuration) as CallDuration_Avg
, Count(c.id) as NumberOfCalls
, t.TimeSlotLower, t.TimeSlotUpper
FROM #Timeslots t
LEFT JOIN #Calls c
ON t.TimeSlotLower <= c.CallStart
AND c.CallStart <= t.TimeSlotUpper
Group By c.EmployeeName, t.TimeSlotLower, t.TimeSlotUpper
ORDER By t.TimeSlotLower
结果是这样的