如何选择未超过值的记录

时间:2013-11-17 17:51:16

标签: sql db2

我希望从数据库中提取作业ID列表,其中每个作业的状态未超过给定条件。

对于此示例表,我想显示所有未超过状态200的jobid,并仅显示最新状态。

工作进度表

Jobid Status Date      Time
1234  100    20131001  080000
1234  200    20131001  100000
1234  300    20131001  140000
9876  100    20131014  110000
5555  100    20131015  100000
5555  200    20131016  080000

我要找的结果是

Jobid Status Date      Time
9876  100    20131014  110000
5555  200    20131016  080000

数据库在AS400上

5 个答案:

答案 0 :(得分:2)

这很好地利用了窗口/分析函数。

您可以使用row_number()获取最新状态。您可以使用sum() over来计算状态超过200的次数。

select jobid, Status, Date, Time
from (select jp.*,
             row_number() over (partition by jobid order by date desc, time desc) as seqnum,
             sum(case when status >= 200 then 1 else 0 end) over (partition by jobid) as status_200
      from JobProgress jp
     ) jp
where status_200 = 0 and seqnum = 1;

where子句然后过滤到您要查找的行。

答案 1 :(得分:1)

select t1.* 
from your_table t1
inner join 
(
  select Jobid, max(date*1000000+time) as maxdt
  from your_table
  group by jobid
  having sum(case when status > 200 then 1 else 0 end) = 0
) t2 on t1.jobid = t2.jobid 
     and t1.date*100000+t1.time = maxdt

答案 2 :(得分:0)

在SQL Server中,您可以使用ROW_NUMBER

SELECT *
FROM (SELECT
            Jobid,
            status,
            ROW_NUMBER() OVER(PARTITION BY Jobid ORDER BY Date DESC) AS rn
      FROM
            Job-Progress
      WHERE Status < 200) A
WHERE RowNum = 1

答案 3 :(得分:0)

这是我能想到的最简单的方法:

SELECT t.* FROM t
INNER JOIN (
  SELECT jobid, max(date) date FROM t
  GROUP BY jobid
  HAVING COUNT(CASE WHEN status > 200 THEN 1 END) = 0
) s
ON t.jobid = s.jobid AND t.date = s.date

小提琴here

答案 4 :(得分:0)

公用表表达式允许您使用ROW_NUMBER()函数将每个作业的最新行标记为1.然后,只要状态可以接受,您需要做的就是选择该行。

With x as
(SELECT *,
        ROW_NUMBER() OVER(PARTITION BY Jobid ORDER BY Date, time DESC) AS pick
      FROM JobProgress
)
SELECT jobid, status, date, time
  FROM x
  WHERE Status <= 200
    And pick = 1