2

我有下表:

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. 一直有两个表,并查询视图而不是表(我只有 INSERT 和 SELECT 记录)。每天将分组记录复制到“分组”表并将它们从“详细”表中删除

在我看来,这两种选择都会产生问题,但也许存在更好的方法?

更新

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

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

所以它是每天和组一个记录,而时间列是每个详细记录的总和。

4

2 回答 2

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 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
于 2013-08-28T14:19:06.477 回答
0

您可以有一个历史表和一个当前表。

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

您不必每天都运行该过程。您可以每月在两个月前的行上运行该过程。换句话说,在 8 月的第一个星期六,您创建了 6 月的历史记录行。您当前的表将有一个月到两个月的行。

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

于 2013-08-28T15:21:28.983 回答