2017-08-13 9 views
0

私はちょうどこの周りに私の頭を得ることができません。差分かフルかを問わず、データベースごとに最新のバックアップのみを表示するには、以下のクエリが必要です。グループ内の1つの行(最新)を表示

私の場合、クエリは特定のデータベースの2つの行をレンダリングします.1つは最新の差分と1つは最新の完全なものです。

ありがとうございます。


SELECT A.server_name as Instance, B.name as Database_Name, 
     ISNULL(Convert(char(19), max(backup_finish_date), 100), 'NEVER') as Backup_Date, case when type='D' then 'FULL' when type='I' then 'DIFFERENTIAL'when type='L' then 'LOG'end as Backup_Type, 
     'Succeeded' as Status 
FROM master.dbo.sysdatabases B LEFT OUTER JOIN 
    msdb.dbo.backupset A 
    ON A.database_name = B.name 
where B.name not in ('master', 'model', 'msdb', 'tempdb') and 
     a.machine_name IS NOT NULL and type in ('D', 'I') 
GROUP BY B.name, A.machine_name, A.server_name, A.type 
ORDER BY B.name, Backup_Date desc, A.type; 
+0

選択トップ(1)... – Serg

+0

あなたがa.type'で 'グループを追加しているので、それがいずれかが表示されます。各タイプの行。 –

+0

Nenand、GROUP BYにa.typeがなければなりません。そうでないと「列msdb.dbo.backupsetは集計関数またはGROUP BYに含まれていないため選択リストに無効です句"。しかし、FULLの行が1行、DIFFERENTIALの行が1行あるのがなぜ分かりましたか? – soti84

答えて

2

あなたは以下のように1によってROW_NUMBERフィルタを使用することができます。

Select * from (
    SELECT A.server_name as Instance, B.name as Database_Name, 
      ISNULL(Convert(char(19), max(backup_finish_date), 100), 'NEVER') as Backup_Date, case when type='D' then 'FULL' when type='I' then 'DIFFERENTIAL'when type='L' then 'LOG'end as Backup_Type, 
      'Succeeded' as Status, 
      RowN = Row_Number() over(Partition by B.name, A.machine_name, A.server_name, A.type order by backup_finish_date desc) 
    FROM master.dbo.sysdatabases B LEFT OUTER JOIN 
     msdb.dbo.backupset A 
     ON A.database_name = B.name 
    where B.name not in ('master', 'model', 'msdb', 'tempdb') and 
      a.machine_name IS NOT NULL and type in ('D', 'I') 
) sq 
Where sq.RowN = 1 
ORDER BY sq.name, sq.Backup_Date desc, sq.type 
+0

row_number()を使用している場合は、もはやgroup byの必要はありませんか? –

+0

こんにちはKannan、これはうまくいった。 GROUP BYにA.backup_finish_dateを追加する必要がありました。それ以外の場合は、SQL Serverエンジンが不平を言い、sq.name(sq.Database_Name)およびsq.type(sq.Backup_Type)にORDER BYのエイリアスを使用しました。ありがとうございました。 – soti84

+0

RowN計算の列単位で処理するので、group byを必要としません。 –

関連する問題