添加未记录数据的空白行以适应模式

Adding blank rows where data hasn't been recorded to fit pattern

我正在考虑做一些关于员工安排的报告,并且需要构建一个图表来显示在 15 分钟的时间间隔内有多少呼叫通过,但还需要在 0 个呼叫通过时显示。

我的主要问题是原始数据来自 phone 系统,该系统仅在收到呼叫时才写入一行。我没问题将数据分成 15 分钟的间隔,但我需要填写空白。

例如,呼叫通过:

但 07:00 没有电话接通。我需要能够为这个时间戳记入一个条目,以便在将其放入图表中时,它可以明显地显示当时有 0 个呼叫通过。

我创建了一个 table,一天中每 15 分钟间隔一次 - 96 行 我强制加入

我的主要目标是,对于数据集的每 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  

以上类作品

是否可以将每 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

结果是这样的