SQL Select Until值=我的值

时间:2015-07-30 19:52:40

标签: sql sql-server

您好我遇到了这个问题。我试图制作SQL命令,它将在状态为0时选择项目数。

Name |   TimeStarted  | Status
Job1 |    210161      |   0
Job1 |    210160      |   0
Job1 |    210159      |   0
Job1 |    210158      |   1
Job1 |    210157      |   0
Job2 |    210156      |   1
Job2 |    210155      |   1
Job3 |    210154      |   1

在这个示例中,Select的结果应该是这样的。

Name  | Job Count
Job1  |     3 
Job2  |     0

此脚本的重点是自上次成功启动以来失败作业的计数。谢谢你的帮助

2 个答案:

答案 0 :(得分:2)

您可以尝试此查询:

select t1.Name, count(t2.Name)
from (
  select Name, max(TimeStarted) as LastSuccessTime
  from TableX
  where Status = 1
  group by Name
) t1
left join TableX t2
on t1.Name = t2.Name
and t1.LastSuccessTime < t2.TimeStarted
group by t1.Name

演示:SQLFiddle

我确信你可能需要考虑边缘情况,例如,如果一个工作从未有过成功的运行会发生什么,等等。但至少它应该让你去。

修改

我实际上认为Gordon Linoff的查询比我的更直截了当。我只是没有意识到它缺少一个很小的条件才能让它正常工作。

以下是他缺少条件的查询,并根据您的数据进行了调整:

select t1.name, count(*) - 1
from tableX t1
where t1.TimeStarted >= (select max(t2.TimeStarted)
                         from tableX t2
                         where t2.Name = t1.Name
                         and t2.status = 1)
group by t1.name;

演示:SQLFiddle

答案 1 :(得分:1)

假设你有一些if id来指定排序:

select name, count(*) - 1
from table t
where t.id <= (select min(id) from table t2 where t2.name = t.name and t2.status <> 0)
group by name;

<=只是包含没有初始0的行。