SQL Server 2008:插入不完整的数据并更新它
Posted
技术标签:
【中文标题】SQL Server 2008:插入不完整的数据并更新它【英文标题】:SQL Server 2008: Inserting incomplete data and updating it 【发布时间】: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 的那些列旁边,我必须应用公式、计算利用率、百分比等更多的列。为每个人编写更新将是一项巨大的挑战。
需要解决方案
对于这种情况有现实世界的专业解决方案吗?
【问题讨论】:
【参考方案1】:我已更改查询的 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
希望我正确理解了您的问题!
【讨论】:
以上是关于SQL Server 2008:插入不完整的数据并更新它的主要内容,如果未能解决你的问题,请参考以下文章
新手试图从 excel 将数据插入 SQL Server 2008
1 - SQL Server 2008 之 使用SQL语句创建具有约束条件的表
在 VB 2010 的数据表中插入新列时,如何更新 SQL Server 2008 数据库?
sqlserver2008 插入3000条/秒,分析IO,发现日志读写远大于正常的数据库读写!我不需要任何日志,如何关闭