Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何选择未超过某个值的记录_Sql_Db2 - Fatal编程技术网

Sql 如何选择未超过某个值的记录

Sql 如何选择未超过某个值的记录,sql,db2,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

我希望从数据库中提取作业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
数据库位于SQL server中的AS400上。您可以使用行号:

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

这是对窗口/分析函数的良好使用

您可以使用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子句然后过滤到您要查找的行。

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

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

Fiddle.

公共表表达式允许您使用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

请说明您的RDBMSIs状态字段是数字还是字符?@Yosi说系统是AS/400当前名称是Power Systems上的IBM i告诉我们DB2集成到IBM i操作系统(以前是OS/400,i5)中/OS@WarrenT-谢谢您的解释。请关闭,但这是针对DB2fori,而不是SQLServer。为您调整了语法。但是它仍然会返回一行jobid1234,嗯?如果状态值不能减少,这个方法是有效的。如果状态可以再次减少,那么检查状态如果状态可以再次减少,那么检查状态
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