0

数時間ごとに実行され、ユーザーが構成したバックアップジョブを記録するルーチンがあります。各ジョブはテーブルにエントリを作成し、エントリの数は0から無限大までのいずれかになります(ユーザーが持っているジョブの数に完全に依存します)。

以下の例では、ユーザーは現在3つのバックアップジョブを構成していますが、私が使用しているSQLクエリは、1週間以上前のデータプルからバックアップをプルしています。LIMITを実行せずに最新のタイムスタンプからエントリのみを取得するようにクエリを調整する方法がわかりません(表示されるエントリの数がわからないため、LIMITを使用できません)。

SELECT BACKUP_SET_ID, BACKUP_SET_TYPE, Max(SNAPSHOT_TIME) maxTime
FROM TABLE_snapshots_backupsets
WHERE ACCOUNT_ID='6000001'
GROUP BY BACKUP_SET_ID;

出力:

+---------------+----------------------------------+---------------------+  
| BACKUP_SET_ID | BACKUP_SET_TYPE                  | maxTime             |  
+---------------+----------------------------------+---------------------+  
| 1359127993672 | FILE                             | 2013-02-04 08:00:01 |  
| 1359145357475 | FILE                             | 2013-02-04 08:00:01 |  
| 1359145395067 | VMware Virtualization            | 2013-02-04 08:00:01 |  
| 1359145404910 | Microsoft Windows Virtualization | 2013-01-27 12:00:01 |  
+---------------+----------------------------------+---------------------+  
4 rows in set (0.00 sec)

したがって、上記の場合、ユーザーが最新のデータプルの時点で構成されていないため、クエリで「MicrosoftWindows仮想化」エントリをプルしないようにする必要があります。最新のタイムスタンプを持つエントリのみをプルする必要があります。

ありがとうございました!

4

1 に答える 1

0

同じタイムスタンプを共有する最新のエントリのみが必要な場合は、ロジックを少し再配置します。

SELECT BACKUP_SET_ID, 
       BACKUP_SET_TYPE, 
       SNAPSHOT_TIME
FROM TABLE_snapshots_backupsets
WHERE SNAPSHOT_TIME = (SELECT Max(SNAPSHOT_TIME) 
                       FROM TABLE_snapshots_backupsets 
                       WHERE ACCOUNT_ID = '6000001')
;

または、「時間範囲」ソリューションが必要な場合は、snapshot_timeにWHERE句を追加します。

WHERE ACCOUNT_ID='6000001' AND SNAPSHOT_TIME > CURTIME() - INTERVAL 7 DAY

その他の日付操作オプションの場合:http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_date-add

于 2013-02-04T16:29:39.353 に答える