Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.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
如何基于DB2数据库中提到的复杂条件编写SQL查询_Sql_Database_Db2 - Fatal编程技术网

如何基于DB2数据库中提到的复杂条件编写SQL查询

如何基于DB2数据库中提到的复杂条件编写SQL查询,sql,database,db2,Sql,Database,Db2,表名为:RUU输出 数据如下: id rudef value jobid st_dt ----------------------------------------------------- 8 23 200 32 1481585920 9 24 2 32 1481989201 12 24 3 32 1481547920 10 26

表名为:RUU输出

数据如下:

id  rudef   value   jobid   st_dt   
-----------------------------------------------------
8   23      200     32      1481585920      
9   24      2       32      1481989201      
12  24      3       32      1481547920      
10  26      50      32      1481544560      
13  26      89      32      1481545920      
14  24      69      32      1481548920  
15  23      56      32      1486899920
16  29      896     32      1486789920
预期结果摘要: 首先,我们必须找到所有计数超过1的rudef, 之后,对于所有这些rudef,只有当lastvalue>secondlastvalue时,我们才能将最后一个和第二个记录值作为不同的列找到

(最后一条记录将基于该记录的id进行假设,即 rudef'24'最后一条记录将是其中的id=14和最后一条记录 其中id=12)

预期结果 注意:即使rudef“23”计数为2,但其最后值为56,小于第二个最后值200,因此将不予以考虑


在大多数数据库中,您可以使用条件聚合和ANSI标准
row\u number()
函数:

select rudef,
       max(case when seqnum = 1 then value end) as last_value,
       max(case when seqnum = 2 then value end) as second_last_value
from (select t.*,
             row_number() over (partition by rudef order by id desc) as seqnum
      from t
     ) t
group by rudef
having max(case when seqnum = 1 then value end) > max(case when seqnum = 2 then value end);
这假设
id
可用于确定最后一个值。(如果需要使用另一列,只需按s更改
顺序即可。)


我应该注意到,您不必检查两个与
rudef
匹配的值。如果只有一个匹配项,则
max()
表达式将为
NULL
,并使
具有
子句的
失败。

在大多数数据库中,您可以使用条件聚合和ANSI标准
行数()
函数:

select rudef,
       max(case when seqnum = 1 then value end) as last_value,
       max(case when seqnum = 2 then value end) as second_last_value
from (select t.*,
             row_number() over (partition by rudef order by id desc) as seqnum
      from t
     ) t
group by rudef
having max(case when seqnum = 1 then value end) > max(case when seqnum = 2 then value end);
这假设
id
可用于确定最后一个值。(如果需要使用另一列,只需按
s更改
顺序即可。)


我应该注意到,您不必检查两个与
rudef
匹配的值。如果只有一个匹配项,则
max()
表达式将为
NULL
,并使具有
子句的
失败。

尝试此操作。但是,您拒绝使用的逻辑
23
,以及使用相同逻辑
26
的逻辑也将不在预期输出中。无论如何,您可以调整内部查询以获得预期的输出。我在Oracle中进行了尝试,它提供了预期的输出

SELECT *
FROM
  ( SELECT rudef,
           max(value) AS lastvalue,
           min(value) AS secondlastvalue
   FROM
     ( SELECT t.*,
              row_number() over (partition BY rudef
                                 ORDER BY value DESC) AS val_rank
      FROM
        ( SELECT r.*,
                 row_number() over (partition BY rudef
                                    ORDER BY id DESC) AS rnk
         FROM RU_OUTPUT r) t
      WHERE rnk <=2 ) s
   WHERE rnk=val_rank
   GROUP BY rudef)
WHERE lastvalue<>secondlastvalue

试试这个。但是,您拒绝使用的逻辑
23
,以及使用相同逻辑
26
的逻辑也将不在预期输出中。无论如何,您可以调整内部查询以获得预期的输出。我在Oracle中进行了尝试,它提供了预期的输出

SELECT *
FROM
  ( SELECT rudef,
           max(value) AS lastvalue,
           min(value) AS secondlastvalue
   FROM
     ( SELECT t.*,
              row_number() over (partition BY rudef
                                 ORDER BY value DESC) AS val_rank
      FROM
        ( SELECT r.*,
                 row_number() over (partition BY rudef
                                    ORDER BY id DESC) AS rnk
         FROM RU_OUTPUT r) t
      WHERE rnk <=2 ) s
   WHERE rnk=val_rank
   GROUP BY rudef)
WHERE lastvalue<>secondlastvalue

检查下面的查询是否适合SQL server或Oracle

        with CTE as
        (
        select * from (
        select * from (
        select *,row_number() over(partition by rudef order by r desc) as Rnk
        from
        ( select *,row_number() over(order by (select 1))  as R from RU_OUTPUT)an

        )a where Rnk < 3  )b  -- change 4 for find 3rd last
        pivot
        (
         max(value)for rnk in ([2],[1])
        )
        as s

        )
        select c1.rudef,max(c1.[1]) as 'lastvalue',
        max(c1.[2]) as 'secondlastvalue'  from CTE C1   
        group by c1.rudef
        having max(c1.[2]) is not null and max(c1.[1]) is not null
        and max(c1.[1]) > max(c1.[2])   -- here condtion is lastvalue > secondlastvalue you can change it also
        order by rudef 

如果您有任何问题,请告诉我们。

请检查下面的查询,查询非常适合SQL server或Oracle

        with CTE as
        (
        select * from (
        select * from (
        select *,row_number() over(partition by rudef order by r desc) as Rnk
        from
        ( select *,row_number() over(order by (select 1))  as R from RU_OUTPUT)an

        )a where Rnk < 3  )b  -- change 4 for find 3rd last
        pivot
        (
         max(value)for rnk in ([2],[1])
        )
        as s

        )
        select c1.rudef,max(c1.[1]) as 'lastvalue',
        max(c1.[2]) as 'secondlastvalue'  from CTE C1   
        group by c1.rudef
        having max(c1.[2]) is not null and max(c1.[1]) is not null
        and max(c1.[1]) > max(c1.[2])   -- here condtion is lastvalue > secondlastvalue you can change it also
        order by rudef 

如果您有任何问题,请告诉我们。

一次只做一件事。首先,编写一个查询来解决计数大于一的问题。然后编写用于比较值的查询。最后,将它们组合起来。
rudef
=23有两条记录。为什么它不在您的预期输出中?@Utsav我在注释中清楚地提到了。好的。纠正错误answer@Utsav数据库中还有一件事是DB2。一次只做一件事。首先,编写一个查询来解决计数大于一的问题。然后编写用于比较值的查询。最后,将它们组合起来。
rudef
=23有两条记录。为什么它不在您的预期输出中?@Utsav我在注释中清楚地提到了。好的。纠正错误answer@UtsavDB还有一件事是DB2。很好,它按预期工作。谢谢你抽出时间,兄弟。就SQL查询而言,您真的很顺利,是的,这很有意义“到目前为止没有VotedDown”如果我在Select语句中的min(value)后面添加一个字段st_dt作为secondlastvalue,那么结果将改变为什么会这样,请考虑我加入的任何列,也可以用Calus添加到组中。谢谢你抽出时间,兄弟。就SQL查询而言,您是非常平滑的,是的,如果在MIN(value)后面的MIN(value)中添加另一个字段STYDT作为第二个LASTSTATE值,那么就有一个问题。然后,结果将改变为什么它是这样的,请考虑我在SELECT中添加的任何列也添加在GROUPBY子句中。