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 時間ごとに記録されます (実際のデータでは 1 分ごとに記録されます)。

私は今日と昨日のためにそのようなフォーマットを持っている必要がありますが、しばらくすると冗長になり始めます - 日をグループ化するだけで十分です.

上記のレコードを削減する次の方法を考えています。

  1. データを新しい「一時」テーブルにコピーし、それらをグループ化する手順を毎日実行します。次に、元のテーブルを削除し、「temp」の名前を変更します。もちろん、すべての関係を復元する必要があります (上記の例の GroupId 列)。
  2. 常に 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

したがって、これは 1 日およびグループごとに 1 つのレコードであり、Time 列はすべての詳細レコードの合計です。

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

次のクエリを実行すると、1 日あたり 1 行だけが残ります。

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 に答える