如何基于DB2数据库中提到的复杂条件编写SQL查询
表名为:RUU输出 数据如下:如何基于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
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子句中。