处理缺失的数据,不完整的数据是业内所有数据采矿员/开发人员(取决于工作职能)所面临的问题。
如果我想将每小时数据(24条记录)转换为每日(1条记录),那么实现这一目标的最佳做法是什么。
having count(*) = 24
子句中使用group by
。那么如何/何时导入那些< 24如果他们永远错过了。having count(*) = 24
子句,所以所有数据都是< 24将被导入。那么如何在它们变为24时重新插入这些值。注意我在日期/时间字段上有主键,因此我需要在重新插入之前删除那些不完整的记录(我不想这样做)。
示例数据
每小时表:PK on Time,ElementNum,RouteName
Time ElementNum RouteName NorthTraffic SouthTraffic
15-3-14 0:00 Element1 Far Yards 12.3 14.5
15-3-14 1:00 Element1 Far Yards 10 11
15-3-14 2:00 Element1 Far Yards 9 10
15-3-14 3:00 Element1 Far Yards 8.5 9.1
… .. .. .. ..
15-3-14 21:00 Element1 Far Yards 25 26.2
15-3-14 22:00 Element1 Far Yards 29.3 33.7
15-3-14 23:00 Element1 Far Yards 25.6 27.8
15-3-14 0:00 Element1 JJ Park 80.1 98.8
15-3-14 1:00 Element1 JJ Park 75.3 86
15-3-14 2:00 Element1 JJ Park 70.9 71.1
15-3-14 3:00 Element1 JJ Park 66.5 67.4
… … … … …
15-3-14 21:00 Element1 JJ Park 112.1 115.5
15-3-14 22:00 Element1 JJ Park 125.4 130.7
15-3-14 23:00 Element1 JJ Park 120 121.3
将每小时转换为每日的SQL查询;每天07:00执行:
SELECT
convert(varchar(10), Time, 120),
ElementNum, RouteName,
MAX(NorthTraffic), MAX(SouthTraffic),
MAX(NorthTraffic) + MAX(SouthTraffic) TotalTrafficMAX
FROM
HourlyTable
WHERE
Time = '15/03/2014'
GROUP BY
convert(varchar(10), Time, 120), ElementNum, RouteName
HAVING
count(*) = 24
日期表格PK,ElementNum,RouteName
Date ElementNum RouteName NorthTrafficMAX SouthTrafficMAX TotalTrafficMAX
15-3-14 Element1 Far Yards 29.3 33.7 63
15-3-14 Element1 JJ Park 125.4 130.7 256.1
问题
如果在0700hrs之前没有在每小时表中填充数据(这很常见),则不会填充每日表。
我的解决方法
需要解决方案
对于这种情况,是否存在真实世界的专业解决方案。
答案 0 :(得分:0)
我已经更改了查询的where子句,尝试在午夜12点之后执行此脚本,它将获取前一天的记录,然后您可以在任何其他表中插入相同的内容。
SELECT convert(varchar(10),Time,120) ,ElementNum ,RouteName
,MAX(NorthTraffic)
,MAX(SouthTraffic)
,MAX(NorthTraffic)+MAX(SouthTraffic) TotalTrafficMAX
from HourlyTable where DATEDIFF(dd,Time,getdate()) = 1
group by convert(varchar(10),Time,120) ,ElementNum ,RouteName
having count(*) = 24
希望我能正确理解你的问题!