减少数据库记录

时间:2013-08-28 14:08:44

标签: sql sql-server

我有以下表格:

GroupId StartDate           Time
1       2013-01-01 15:00    10
1       2013-01-01 16:00    10
1       2013-01-01 17:00    10
1       2013-01-02 08:00    10
1       2013-01-02 09:00    10
2       2013-01-01 15:00    2
2       2013-01-01 16:00    2

在上面的例子中有每小时的记录(在实际数据中它是每分钟的记录)。

我需要在今天和昨天使用这种格式,但过了一段时间后它开始变得多余了 - 日分组绰绰有余。

我在思考如何减少以上记录:

  1. 每天运行程序,将数据复制到新的“临时”表,将它们组合在一起。然后删除原始表并重命名为“temp”。但当然我必须恢复所有关系(上例中的GroupId列)。
  2. 始终有两个表,并查询View而不是表(我只有INSERT和SELECT记录)。每天将分组记录复制到“分组”表并将其从“详细”表中删除
  3. 在我看来,这两个选项都会产生问题,但也许存在更好的方法?

    更新

    由于第一个答案,我想我可能会被误解。结果记录应该遵循

    GroupId StartDate           Time
    1       2013-01-01 00:00    30
    1       2013-01-02 00:00    20
    2       2013-01-01 00:00    4
    

    因此它是每天一组和一组记录,而时间列是每条详细记录的总和。

2 个答案:

答案 0 :(得分:1)

您可以只在表中添加一个额外的Rowid列(自动生成的ID),然后按唯一列分组,而不是创建其他表,并使用以下查询:

DELETE Table1 
FROM Table1
LEFT OUTER JOIN (
SELECT MIN(RowId) as RowId, GroupId, StartDate, Time 
FROM Table1 
GROUP BY GroupId, StartDate, Time
) as Table2 ON
Table1.RowId = Table2.RowId
WHERE
Table2.RowId IS NULL

以下是我的解释: 我的表格包含以下数据:

 GroupId    StartDate    Time    Rowid
 1  2013-01-01 15:01:00.000 10  101
 1  2013-01-01 15:09:00.000 10  102
 1  2013-01-01 15:59:00.000 10  103
 1  2013-01-01 16:42:00.000 10  104
 1  2013-01-01 16:52:00.000 10  105
 1  2013-01-01 17:21:00.000 10  106
 1  2013-01-01 17:46:00.000 10  107
 1  2013-01-01 17:56:00.000 10  108
 1  2013-01-02 08:10:00.000 10  109
 1  2013-01-02 09:20:00.000 10  110
 2  2013-01-01 15:45:00.000 2   111
 2  2013-01-01 15:35:00.000 2   112
 2  2013-01-01 16:35:00.000 2   113

现在,在运行以下查询后,我每天只剩下一行:

DELETE Table1 
FROM test24 Table1
LEFT OUTER JOIN (
SELECT MIN(RowId) as RowId, GroupId, Convert(Varchar(10),StartDate,120)StartDate, Time 
FROM test24 
GROUP BY GroupId, Convert(Varchar(10),StartDate,120), Time
) as Table2 ON
Table1.RowId = Table2.RowId
WHERE
Table2.RowId IS NULL

 GroupId    StartDate           Time    rowid
   1    2013-01-01 15:01:00.000 10  101
   1    2013-01-02 08:10:00.000 10  109
   2    2013-01-01 15:45:00.000 2   111

现在,您可以运行update语句,根据您所需的格式更改日期。

Update test24
set StartDate=Convert(Varchar(10),StartDate,120)

GroupId StartDate     Time    rowid
   1    2013-01-01       10   101
   1    2013-01-02       10   109
   2    2013-01-01        2   111

答案 1 :(得分:0)

您可以拥有历史记录表和当前表。

您必须拥有一个读取和合并当前行并创建历史记录行的流程。

您不必每天运行该过程。您可以在两个月之前每月对这些行运行该过程。换句话说,在八月的第一个星期六,您将创建六月的历史记录行。您当前的表格将有一个月到两个月的行。

您可能希望创建一个视图和/或存储过程,首先从当前表中选择,然后选择历史记录表,以便大多数其他应用程序不必知道处理两个表。

相关问题