-1

在最后一个查询中,将批处理 2 包含在结果中作为“处理”的好方法是什么?每个批次都有几个子任务。该批次的整体状态是我正在寻找的。

任务状态含义:

  • 1=待定
  • 2=处理
  • 3=重试
  • 4=完成
  • 5=失败

批次状态:

  • 批次 1 正在处理
  • Batch 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
4

3 回答 3

1

更新

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演示。

于 2013-07-10T20:58:10.343 回答
0

我更喜欢选择子查询,因为它是迄今为止我所见过的最直接的查询。

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
于 2013-07-12T12:43:29.747 回答
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);

现在,您可以使用以下查询的 CASE 语句中定义的逻辑导出“批次状态”:

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 示例

在上面的查询中,我使用值 1 表示 Pending 的“批处理状态”,使用 2 表示 Processing 的“批处理状态”,使用 4 表示 Complete 的“批处理状态”。您可以创建一个 BatchStatus 表来真正定义这些值,尽管这不是绝对必要的。

如果您需要根据任务状态的其他组合导出其他“批处理状态”,那么您将需要 TaskStatus 表上的附加标志字段以及 CASE 语句中更复杂的逻辑。

于 2013-07-10T21:39:50.380 回答