我怎么知道GROUP BY缺少数据?

时间:2014-10-09 20:34:01

标签: sql sql-server sql-server-2008 tsql

我们有一个进程可以读取大量文件并将所有数据导入我们的sql server表。由于这些任务的复杂性,我只能在将数据插入我们的tsql表后才能处理数据。

此表的名称为[CounterRawData15mins],数据如下所示:

Cell   Date      Hour    Minute    Counter   Value
AB1    20141008  14      00        C1        10
AB1    20141008  14      15        C1        20
AB1    20141008  14      30        C1        30
AB1    20141008  14      45        C1        40
CF4    20141008  14      00        C1        50
CF4    20141008  14      15        C1        40
CF4    20141008  14      45        C1        20

我们有几个报告按小时间隔使用这些数据,只需按单元格和分钟进行分组。如果我想按小时查看计数器 C1 的总数,我可以使用此查询:

SELECT Cell, Date, Hour, sum(C1) FROM CounterRawData15mins 
PIVOT (SUM(value) FOR counter in (C1) ) AS pvt 
where Date = 20141008
GROUP BY Cell, Date, Hour

使用上面的数据,查询将正确添加所有内容。不幸的是,如果您注意到, CF4 单元格在14:30时间内没有数据,那么 CF4 为120的总数不正确,因为那里有&#39 ; s数据丢失。 AB1 的数据为14:00 - 14:45,所以这是正确的。

由于大多数查询与上面的查询类似,是否有可能添加一些标记,将记录标记为没有4个季度的所有数据?

例如,运行上面的查询,所需的结果将是:

Cell   Date      Hour    C1     DataMissing
AB1    20141008  14      100    
CF4    20141008  14      110    Yes

如果有一种方法可以确定(通过相同的查询)缺少15分钟的季度数据,那就更好了。

我还有一个[时间]表,其中包含小时和15分钟时段的所有可能组合,但我不确定如何进行外连接。 感谢。

1 个答案:

答案 0 :(得分:3)

在这种情况下,数据丢失意味着您缺少一行。在这种情况下,您可以使用COUNT(*)和case语句来解决您的问题:

SELECT Cell, 
       Date, 
       Hour, 
       SUM(C1) as C1, 
       CASE WHEN COUNT(*) = 4 
         THEN '' 
         ELSE 'Yes' 
       END as DataMissing
  FROM CounterRawData15mins
 PIVOT (SUM(value) FOR counter in (C1) ) AS pvt 
 WHERE Date = 20141008
 GROUP BY Cell, Date, Hour

上述查询假定您列出的时间间隔为15分钟,但您可以将检查设置为适当的预期分钟数。您可以根据您的点数量进行不同的检查。

编辑:根据您的评论,我采取了不同的方法。你真正想要做的是转移多个聚合,这会变得混乱。使用this answer作为参考,这产生了我正在寻找的结果:

select 
    Cell, 
    Date, 
    Hour,
    C1 = SUM(CASE WHEN counter = 'C1' THEN value else 0 end),
    C2 = SUM(CASE WHEN counter = 'C2' THEN value else 0 end),
--Each column needed
C1DataIssue = 
    CASE WHEN COUNT(distinct CASE WHEN counter = 'C1' THEN minute else NULL end) = 4 THEN '' 
    ELSE 'Yes' END,
C2DataIssue = 
    CASE WHEN COUNT(distinct CASE WHEN counter = 'C2' THEN minute else NULL end) = 4 THEN '' 
    ELSE 'Yes' END
from dbo.CounterRawData15mins
group by cell, date, hour

你仍然有问题(对于一个支点来说,你必须为每一列构建一个真实的问题),但这比混杂的多个支柱要麻烦得多。

EDIT2:这里是一个SQL小提琴example,我设置了两个不良数据案例,单元格AB1和计数器C2,有两个15分钟的增量,单元格CF4和计数器C1是你原来的示例