【发布时间】:2014-04-20 18:04:32
【问题描述】:
处理缺失数据、不完整数据是行业内所有数据挖掘者/开发者(取决于工作职能)都面临的问题。
如果我想将每小时数据(24 条记录)转换为每天(1 条记录),实现此目的的最佳做法是什么。
- 在
group by子句中使用having count(*) = 24。那么如何/何时导入那些 - 不要使用
having count(*) = 24子句,所以即使是
请注意,我在日期/时间字段上有主键,因此我需要先删除那些不完整的记录,然后再重新插入(我不想这样做)。
样本数据
小时表:PK准时、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 查询;每天 0700 时执行:
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
Date、ElementNum、RouteName 上的每日表 PK
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
问题
如果在 0700 小时之前(这很常见)未在小时表中填充数据,则不会填充每日表。
我的解决方法
- 不要添加have子句,但是daily表中的数据会不准确。然后作为第二步编写存储过程,它将每小时运行一次并更新每日表的 MAX 列。这种方式太麻烦了。虽然我已经在许多其他项目中进行过这种更新,但在这里我觉得我应该有一些专业的方法,最重要的是,在 MAXTraffic 的那些列旁边,我必须应用公式、计算利用率、百分比等更多的列。为每个人编写更新将是一项巨大的挑战。
需要解决方案
对于这种情况有现实世界的专业解决方案吗?
【问题讨论】:
标签: sql-server-2008 aggregate-functions missing-data