2013-07-10 1 views
-1

"처리 중"결과에 배치 2를 포함시키는 것이 가장 좋은 방법은 무엇입니까? 각 배치에는 여러 하위 작업이 있습니다. 일괄 처리의 전반적인 상태가 내가 찾고있는 것입니다.여러 행에서 그룹화 된 의미를 유도하십시오.

작업 상태 의미 :

  • 1 = 보류
  • 2 = 처리
  • 3 =
  • 4 = 완전한
  • 5 =이

배치 상태를 실패한 재 시도 :

  • 배치 1이 처리 중임
  • 배치 2가 처리 중에 있지만 아직 보류중인 작업이 선택되지 않았습니다. 이런 일이 발생하기까지 몇 초가 걸릴 것이므로 "수면"유형 상태에 관심이 없습니다.
  • 배치 3은 다시 시도하는 작업으로 처리합니다.
  • 아무 것도 선택되지 않았기 때문에 배치 4가 처리되지 않습니다.
  • 완료 되었기 때문에 배치 5가 처리되지 않음
  • 실패한 작업이 있기 때문에 배치 6이 처리 중이 아닙니다.

코드 :

IF OBJECT_ID('tempdb..#t') IS NOT NULL DROP TABLE #t 
CREATE TABLE #t (batchId INT, taskStatus INT) 
INSERT INTO #t(batchId, taskStatus) VALUES 
     (1, 1), 
     (1, 2), 
     (1, 4), 
     (2, 1), 
     (2, 1), 
     (2, 4), 
     (2, 4), 
     (3, 3), 
     (3, 4), 
     (4, 1), 
     (4, 1), 
     (5, 4), 
     (5, 4), 
     (6, 5), 
     (6, 4) 

SELECT 
    batchId, 
    1 processing 
FROM #t 
WHERE taskStatus IN (2,3) 
GROUP BY batchId 
+0

작업 2는 보류 중 상태와 완료 상태를 모두 가지고 있습니다. 두 코드를 사용하여 작업 상태를 처리로 간주하거나 결정하는 방법은 무엇입니까? –

+0

taskStatus IN (2,3)에서 검색하는 경우 taskStatus가 절대로 null이되지 않습니다. 해당 입력을 taskStatus별로 정렬하십시오. "일부 작업을 처리하고 다른 작업이 보류중인 경우 처리"는 분명하지 않습니다. – Paparazzi

+0

마지막 쿼리의 상태는 전체 일괄 처리에 대한 것입니다. 일괄 처리에는 여러 개의 하위 작업이 있으며 일부 작업이 완료되고 다른 작업이 보류중인 경우 "처리 중"으로 간주됩니다. –

답변

0

필자는 지금까지 본 모든 항목 중에서 가장 간단한 항목으로 select 하위 쿼리를 선호합니다.

SELECT 
    t.batchId, 
    CASE 
     WHEN EXISTS(SELECT 1 FROM #t WHERE taskStatus IN (2,3) AND batchId = t.batchId) THEN 1 
     WHEN EXISTS(SELECT 1 FROM #t WHERE taskStatus=1 AND batchId = t.batchId) AND EXISTS(SELECT 1 FROM #t WHERE taskStatus=4 AND batchId = t.batchId) THEN 1 
     ELSE 0 
    END processing 
FROM #t t 
GROUP BY batchId 
1

UPDATE

SELECT batchId, 1 processing 
    FROM Table1 
GROUP BY batchId 
HAVING SUM(CASE WHEN taskStatus IN(2,3) THEN 1 ELSE 0 END) > 0 
    OR (SUM(CASE WHEN taskStatus IN(1,4) THEN 1 ELSE 0 END) = COUNT(*) 
    AND COUNT(DISTINCT taskStatus) = 2) 

여기 SQLFiddle 데모입니다. 질문의 원래 버전

원래 대답은 :

SELECT batchId, 1 processing 
    FROM Table1 
GROUP BY batchId 
HAVING COUNT(*) * 4 > SUM(taskStatus) 

이 쿼리는 불완전한 작업에 모두 배치를 돌려줍니다.

여기에 SQLFiddle 데모가 있습니다.

+0

예,하지만 원래 질문에 포함시키지 않은 문제가 있습니다. 작업은 오류, 취소 등의 항목에 대해 4보다 큰 상태를 가질 수 있습니다. 또한 작업을 위해 약간의 수정을해야했습니다. "SUM (taskStatus) COUNT (*) * 1" –

+0

@MicahBurnett 처음에는 질문. 그것은 매우 중요한 세부 사항입니다. 이제 실패한 작업으로 어떻게 배치를 처리하고 싶습니까? – peterm

+0

@MicahBurnett 가능한 해결책으로 업데이트 된 답변보기. 하나의 배치에 1에서 3까지의 상태를 가진 하나 이상의 작업이 포함되어 있다면 배치 4가 "처리 중"으로 간주되지 않으므로 불완전한 = 처리 – peterm

0

내가 말한 것은 본질적으로 보류, 처리 및 완료라는 작업 상태와 대략 동일한 3 가지 '일괄 처리 상태'를 의미한다고 해석합니다.

따라서, 주어진 작업 상태에 대한 당신은 두 가지를 알아야합니다

  1. 이 작업 상태는 작업이 시작되었음을 나타냅니다합니까?
  2. 이 작업 상태는 작업이 완료되었음을 나타 냅니까?내가 아래에했던 것처럼

당신이 그 상태를 정의하는 TaskStatus 테이블이있는 경우에, 당신은, 그 테이블에 일부 플래그 열을 추가 할 수 있습니다

CREATE TABLE TaskStatus (
    taskStatusId INT, 
    taskStatusName VARCHAR(50), 
    taskStarted TINYINT, 
    taskCompleted TINYINT 
); 
INSERT INTO TaskStatus values (1, 'Pending', 0, 0); 
INSERT INTO TaskStatus values (2, 'Processing', 1, 0); 
INSERT INTO TaskStatus values (3, 'Retrying', 1, 0); 
INSERT INTO TaskStatus values (4, 'Complete', 1, 1); 

은 이제 "배치 상태를 유도 할 수있다 쿼리 AB에서

select 
    Task.batchId, 
    CASE 
    WHEN max(TaskStatus.taskStarted) = 0 AND min(TaskStatus.taskCompleted) = 0 THEN 1 
    WHEN max(TaskStatus.taskStarted) > 0 AND min(TaskStatus.taskCompleted) = 0 THEN 2 
    WHEN max(TaskStatus.taskStarted) > 0 AND min(TaskStatus.taskCompleted) > 0 THEN 4 
    END as batchStatusId 
FROM Task 
INNER JOIN TaskStatus on 
    Task.taskStatus = TaskStatus.taskStatusId 
group by 
    Task.batchId 

sqlfiddle sample

: 아래의 쿼리의 CASE 문에 정의 된 "논리를 사용하여 ove, 나는 Pending의 "batch status"를 표시하기 위해 1을, Processing의 "batch status"를 나타 내기 위해 2를, Complete의 "batch status"를 나타 내기 위해 4를 사용하고있다. 엄격하게 필요하지는 않지만 BatchStatus 테이블을 만들어 진정한 값을 정의 할 수 있습니다.

다른 작업 상태 조합을 기반으로 다른 "배치 상태"를 파생해야하는 경우 TaskStatus 테이블에 추가 플래그 필드와 CASE 문에서 더 복잡한 논리가 필요합니다.

관련 문제