백업 어플라이언스 (Avamar)의 ProgreSQL DB 테이블에서 백업 작업에 대한 세부 정보를 수집하려고합니다. 이 테이블에는 client_name, dataset, plugin_name, type, completed_ts, status_code, bytes_modified 등 여러 열이 있습니다. 간단한 예 :GROUP BY 결과에 기초한 다중 자체 조인
| session_id | client_name | dataset | plugin_name | type | completed_ts | status_code | bytes_modified |
|------------|-------------|---------|---------------------|------------------|----------------------|-------------|----------------|
| 1 | server01 | Windows | Windows File System | Scheduled Backup | 2017-12-05T01:00:00Z | 30900 | 11111111 |
| 2 | server01 | Windows | Windows File System | Scheduled Backup | 2017-12-04T01:00:00Z | 30000 | 22222222 |
| 3 | server01 | Windows | Windows File System | Scheduled Backup | 2017-12-03T01:00:00Z | 30000 | 22222222 |
| 4 | server01 | Windows | Windows File System | Scheduled Backup | 2017-12-02T01:00:00Z | 30000 | 22222222 |
| 5 | server01 | Windows | Windows VSS | Scheduled Backup | 2017-12-01T01:00:00Z | 30000 | 33333333 |
| 6 | server02 | Windows | Windows File System | Scheduled Backup | 2017-12-05T02:00:00Z | 30000 | 44444444 |
| 7 | server02 | Windows | Windows File System | Scheduled Backup | 2017-12-04T02:00:00Z | 30900 | 55555555 |
| 8 | server03 | Windows | Windows File System | On-Demand Backup | 2017-12-05T03:00:00Z | 30000 | 66666666 |
| 9 | server04 | Windows | Windows File System | Validate | 2017-12-05T03:00:00Z | 30000 | 66666666 |
각 클라이언트 _ (서버)는 복수의 데이터 세트를 가질 수 있으며, 각 세트는 복수 plugin_names을 가질 수있다. 그래서 나는 시간이 지남에 따라 "job"활동의 목록을 얻기 위해이 세 컬럼의 GROUP BY를 수행하는 SQL 문을 작성했습니다.
select
client_name,
dataset,
plugin_name
from v_activities_2
where
type like '%Backup%'
group by
client_name, dataset, plugin_name
이러한 작업의 각 (http://sqlfiddle.com/#!15/f15556/1)
는 성공할 수 또는 STATUS_CODE 열을 기반으로 실패. 사용 나는 그것의 completed_ts (완료 시간)와 함께 마지막으로 좋은 백업의 결과를 얻을 수 및 bytes_modified하고있어 하위 쿼리와 자체 조인 더 : ( http://sqlfiddle.com/#!15/f15556/16)select
a2.client_name,
a2.dataset,
a2.plugin_name,
a2.LastGood,
a3.status_code,
a3.bytes_modified as LastGood_bytes
from v_activities_2 a3
join (
select
client_name,
dataset,
plugin_name,
max(completed_ts) as LastGood
from v_activities_2 a2
where
type like '%Backup%'
and status_code in (30000,30005) -- Successful (Good) Status codes
group by
client_name, dataset, plugin_name
) as a2
on a3.client_name = a2.client_name and
a3.dataset = a2.dataset and
a3.plugin_name = a2.plugin_name and
a3.completed_ts = a2.LastGood
내가 별도로 같은 일을 할 수 WHERE의 status_code 행을 제거하여 마지막 시도 세부 정보를 얻으십시오 : http://sqlfiddle.com/#!15/f15556/3. 대부분의 시간 LastGood와 LastAttempted는 동일한 행이지만 마지막 백업이 성공했는지에 따라 그렇지 않은 경우가 있습니다.
나는이 두 문장을 가능한 병합하여 병합하고 있습니다.
난 그냥 다른 권리를 추가 시도 된| client_name | dataset | plugin_name | lastgood | lastgood_bytes | lastattempt | lastattempt_bytes |
|-------------|---------|---------------------|----------------------|-----------------|----------------------|-------------------|
| server01 | Windows | Windows File System | 2017-12-04T01:00:00Z | 22222222 | 2017-12-05T01:00:00Z | 11111111 |
| server01 | Windows | Windows VSS | 2017-12-01T01:00:00Z | 33333333 | 2017-12-01T01:00:00Z | 33333333 |
| server02 | Windows | Windows File System | 2017-12-05T02:00:00Z | 44444444 | 2017-12-05T02:00:00Z | 44444444 |
| server03 | Windows | Windows File System | 2017-12-05T03:00:00Z | 66666666 | 2017-12-05T03:00:00Z | 66666666 |
최종 (http://sqlfiddle.com/#!15/f15556/4) 및 NULL 행을 얻기에 가입 : 그래서이 결과를 얻을 것이다. 몇 가지 독서를 한 후에 처음 두 JOIN이 2 차 조인이 발생하기 전에 임시 테이블을 먼저 작성했지만 그 시점에서 필요한 데이터가 손실되어 NULL 행이 표시되는 것을 볼 수 있습니다.
groovy 스크립팅을 통한 PostgreSQL 8 사용. 또한 DB에 대한 읽기 전용 액세스 권한도 있습니다.
가능한 중복 GROUP \ _BYs의 2 개의 LEFT JOIN] (https://stackoverflow.com/questions/45250646/strange-duplicate-behavior-from-group-concat-of-two-left-joins-of-group-bys) – philipxy
감사. v_activities_2는 Avamar 장비가 읽기 전용 액세스를 제공하는보기입니다. 나는 실제 데이터베이스 테이블이나 제약 조건에 대해 알지 못한다. 각보기에 대한 설명과 열의 의미 만 있습니다. 나는 client_name, dataset, plugin_name이 함께 Common Key (CK)를 형성하고 그 CK에 기반하여 테이블을 조인/병합하려고 시도했다는 것에 동의한다. – Halfdone
저는 두 가지 작동 솔루션을 생각해 냈습니다 : http://sqlfiddle.com/#!15/f15556/114 및 http://sqlfiddle.com/#!15/f15556/149 따라와 더 빨리). 나는 나의 상황에서 LastGood가 없을 수도있는 동안 LastAttempt도있을 것이라는 것을 깨닫는 데 도움이되는 하나의 항목을 추측합니다. – Halfdone