SQL Server 2008:插入不完整的数据并进行更新

时间:2014-03-15 09:43:57

标签: sql-server-2008 aggregate-functions missing-data

处理缺失的数据,不完整的数据是业内所有数据采矿员/开发人员(取决于工作职能)所面临的问题。

如果我想将每小时数据(24条记录)转换为每日(1条记录),那么实现这一目标的最佳做法是什么。

  1. having count(*) = 24子句中使用group by。那么如何/何时导入那些< 24如果他们永远错过了。
  2. 不要使用having count(*) = 24子句,所以所有数据都是< 24将被导入。那么如何在它们变为24时重新插入这些值。
  3. 注意我在日期/时间字段上有主键,因此我需要在重新插入之前删除那些不完整的记录(我不想这样做)。

    示例数据

    每小时表: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之前没有在每小时表中填充数据(这很常见),则不会填充每日表。

    我的解决方法

    1. 不要添加having子句,但每日表中的数据将不准确。然后作为第二步编写将每小时运行的存储过程并更新每日表的MAX列。这种方式太麻烦了。虽然我在许多其他项目中都做过这种更新,但在这里我觉得我应该有一些专业的方法,最重要的是在MAXTraffic的那些列旁边还有更多的列,我必须应用公式,计算利用率,百分比等。为每个人编写更新将是一个巨大的挑战。
    2. 需要解决方案

      对于这种情况,是否存在真实世界的专业解决方案。

1 个答案:

答案 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

希望我能正确理解你的问题!