条件计数和分组与实时数据

时间:2013-08-06 08:28:13

标签: sql-server sql-server-2008-r2

我能够找到有关我的查询的similarclose-match个问题。但我想知道是否有更好的方法来做同样的事情。

我有一个数据库表,通过调用Web服务端点来填充。当某个事件发生并且向该表插入新记录时,将调用该端点。这些事件是实时发生的,事件没有固定的频率或发生模式。

表格如下:

CREATE TABLE MyTbl(id int, type nvarchar(10), timestamp datetime, category nvarchar(50));

我从表中获取数据:

SELECT category,
COUNT(CASE WHEN type = 'sent' THEN 1 END) sent,
COUNT(CASE WHEN type = 'received' THEN 1 END) received,
COUNT(CASE WHEN type = 'blocked' THEN 1 END) blocked,
COUNT(CASE WHEN type = 'opened' THEN 1 END) opened
FROM MyTbl
WHERE timestamp >= '2013-01-01 00:00:00' AND timestamp < '2013-02-01 00:00:00'
GROUP BY category

有关该报告的database schemasample dataselect-query的详细信息,请here

鉴于:

  
      
  1. 数据实时输入表格
  2.   
  3. 表将存储大量数据。 10,00,000多条记录
  4.   
  5. 报告查询的结构不会改变
  6.   
  7. 数据将按类别,日期和日期过滤(所有都是可选参数)
  8.   
  9. 时间不相关,只有日期部分
  10.   

运行定期运行的计划任务并使用MyTbl的值更新新表是不是一个好主意?新表看起来与报表查询类似:

Date | Category | Sent | Received | Blocked | Opened

将通过应用类别和日期过滤器来查询此表。

这种方法的否定:

  
      
  1. 我们仍需要每天维护数据
  2.   
  3. 我们仍然需要应用GROUP BY和SUM
  4.   
  5. 可能需要比原始方法更多的数据库操作
  6.   
  7. 我们无法获得所有实时数据。
  8.   

这种方法的积极因素:

  
      
  1. 可以加速从数据库中取出的记录,这可以加快显示,排序和分页的过程。
  2.   

这是一种可行的方法吗? 还有其他方法可以加快这个过程吗?请帮忙!

1 个答案:

答案 0 :(得分:2)

是的,这是一种可行的方法。

您可能还需要考虑将查询重新配置为PIVOT

select *
from 
    (select [date],category, [type] 
       from yourtable 
       where timestamp between '2013-01-01' and '2013-02-01') d
pivot 
(count (type) for [type] in (sent,blocked,received,opened)) p