【问题标题】:Using SQL to show conference system usage volume through the day使用 SQL 显示全天会议系统使用量
【发布时间】:2017-02-19 04:44:11
【问题描述】:

目标:创建一份报告,根据历史数据提供我们会议系统在一天中的任何时间的平均线路数

给定: 会议唯一 ID、会议开始时间(时间)、会议结束时间(时间)、会议持续时间(基本上是结束时间 - 开始时间的整数)、每个会议上的行数.这些是代表 2 年数据的约 250,000 行的 SQL 表中的列。

问题:一开始这看起来很容易。只需运行一个查询,按小时和分钟查找行和组的总和,如下所示:

Select Datepart(hour,[Actual Conference Begin Time]) as 'Hour',
       Datepart(minute,[Actual Conference Begin Time]) as 'Minute', 
       SUM([Actual Total Lines]) as 'Lines'
From Filtered
Group By DatePart(hour,[Actual Conference Begin Time]),
         Datepart(minute,[Actual Conference Begin Time])
Order By DatePart(hour,[Actual Conference Begin Time]),
         Datepart(minute,[Actual Conference Begin Time])

但是此查询仅考虑“在那个时间开始”的调用的总行数。它没有捕捉到这样一个事实,即在一天中的任何给定分钟,都有多个呼叫在进行,这些呼叫都在不同的时间开始并运行了不同的持续时间。

建议的解决方案:我最初解决这个问题的计划是创建另一个表并使用循环在一天中的那个小时内用一个每小时和每分钟的外壳填充它。然后基本上逐行“解析”我的主数据表并找到开始时间、持续时间和行数,然后转到我的小时/分钟表并从开始时间开始填充它,并向下填充相同数字的行行数作为持续时间。它将通过添加到当前单元格中的值而不是替换来在另一列中用“# of lines”填充这些中的每一个。小时/分钟表本质上是系统上任何给定小时/分钟行数的一个大计数板。

建议的解决方案 2: 我还想到了另一个潜在的解决方案。查看数据库中的每一行,并在开始和结束时间戳之间的每分钟创建更多相同的行。因此,例如,如果您有一个 10 分钟的电话,则将在每列中创建 9 多行,其中包含所有相同的信息,除了每行中的时间戳会多一分钟。现在表中将有足够的数据来运行上面的聚合查询。

我已经创建了小时/分钟的 shell 表,但我认为上述解决方案在 SQL 中可能无法实现。我还尝试在 Tableau 中操作数据而没有结果。

如果您知道用 SQL 或其他方法呈现此信息的解决方案,请告诉我。我有更多代码要分享以显示进度。

谢谢。

【问题讨论】:

  • 使用从 0 到您的经期分钟数的计数表 n= int。将 n 分钟添加到您的期间的开始日期。那是你的日历。现在,您可以在日历中加入跨分钟的事件。按分钟分组后添加行。

标签: sql sql-server load tableau-api


【解决方案1】:

我无法忍受你的列名,因为需要转义,所以我正在简化它们。

这就是想法。为每个开始和结束创建一个新记录。然后在每个时间点,将开始次数与结束次数相加,即可得到任意时间点的数字:

with be as (
      select thetime, sum(inc) as in
      from (select begintime as thetime, 1 as inc
            from filtered
            union all
            select endtime,  -1 as inc
            from filtered
           ) be
     )
select thetime, sum(inc) over (order by thetime) as numConcurrentLines
from be;

这会显示每次电话会议开始和结束的值。这应该为您指明您想做的事情的正确方向。

【讨论】:

  • 谢谢 Gordon,我查看了那个和我找到的另一个解决方案并最终做了这样的事情(超级简单,但我自己并不明显):
【解决方案2】:
DECLARE @t1 time(0)= '00:00:00'
DECLARE @t2 time(0)= '00:01:00'
DECLARE @counter int=1

While @counter<=1440
Begin
SELECT @t1 as 'Time (24hr)', SUM([Actual Total Lines]) as 'Total Lines' 
FROM Filtered 
WHERE @t2 >= [Actual Conference Begin Time] AND [Actual Conference End Time]>= @t1
Set @t1= Dateadd(minute,1,@t1)
Set @t2= Dateadd(minute,1,@t2)
Set @counter= @counter+1
End;

【讨论】:

  • 感谢 Gordon,我查看了那个和我找到的另一个解决方案并最终做了类似的事情 - 超级简单,但我自己并不明显
猜你喜欢
  • 2023-03-20
  • 2013-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-03
  • 1970-01-01
相关资源
最近更新 更多