我有以下表格:
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
在上面的例子中有每小时的记录(在实际数据中它是每分钟的记录)。
我需要在今天和昨天使用这种格式,但过了一段时间后它开始变得多余了 - 日分组绰绰有余。
我在思考如何减少以上记录:
在我看来,这两个选项都会产生问题,但也许存在更好的方法?
更新
由于第一个答案,我想我可能会被误解。结果记录应该遵循
GroupId StartDate Time
1 2013-01-01 00:00 30
1 2013-01-02 00:00 20
2 2013-01-01 00:00 4
因此它是每天一组和一组记录,而时间列是每条详细记录的总和。
答案 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)
您可以拥有历史记录表和当前表。
您必须拥有一个读取和合并当前行并创建历史记录行的流程。
您不必每天运行该过程。您可以在两个月之前每月对这些行运行该过程。换句话说,在八月的第一个星期六,您将创建六月的历史记录行。您当前的表格将有一个月到两个月的行。
您可能希望创建一个视图和/或存储过程,首先从当前表中选择,然后选择历史记录表,以便大多数其他应用程序不必知道处理两个表。