我们有一个进程可以读取大量文件并将所有数据导入我们的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分钟时段的所有可能组合,但我不确定如何进行外连接。 感谢。
答案 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是你原来的示例