根据特殊组 hql 中的列的最大值有条件地更新
update conditionally base on maximum of a column in a special group hql
我想根据 c1、c2、c3 列更新每个分组数据的 c5 列(到 1),其中 c3 在同一个 c1、c2 中最大 group.I 我正在使用 sql on oracle db
c1 | c2 | c3 | c4 | c5 | c5 after update
2000 | a | 01 | x | 0 | 0
2000 | a | 01 | y | 0 | 0
2000 | a | 01 | z | 0 | 0
2000 | a | 02 | z | 0 | 1
2000 | a | 02 | x | 0 | 1
...........................
2000 | b | 01 | x | 0 | 0
2000 | b | 01 | y | 0 | 0
2000 | b | 01 | z | 0 | 0
2000 | b | 02 | z | 0 | 1
..........................
..........................
2001 | a | 01 | x | 0 | 0
2001 | a | 01 | y | 0 | 0
2001 | a | 01 | z | 0 | 0
2001 | a | 02 | z | 0 | 0
2001 | a | 02 | x | 0 | 0
2001 | a | 02 | y | 0 | 0
2001 | a | 02 | w | 0 | 0
2001 | a | 03 | y | 0 | 1
2001 | a | 03 | w | 0 | 1
...........................
2001 | b | 01 | x | 0 | 0
2001 | b | 01 | y | 0 | 0
2001 | b | 02 | x | 0 | 1
2001 | b | 02 | z | 0 | 1
您可以使用 windows 聚合函数 max
按列 c1
、c2
在 case
中对其进行分区,如下所示,以生成您想要的结果。
SELECT t2.c1,
t2.c2,
t2.c3,
t2.c4,
CASE
WHEN t2.c3 = max(t2.c3) over(partition BY t2.c1, t2.c2
ORDER BY t2.c1) THEN 1
ELSE 0
END AS c5
FROM table1 t2
ORDER BY t2.c1,
t2.c2,
t2.c3
结果
C1 C2 C3 C4 C5
-----------------------
2000 a 1 x 0
2000 a 1 y 0
2000 a 1 z 0
2000 a 2 z 1
2000 a 2 x 1
2000 b 1 x 0
2000 b 1 y 0
2000 b 1 z 0
2000 b 2 z 1
2001 a 1 x 0
2001 a 1 y 0
2001 a 1 z 0
2001 a 2 x 0
2001 a 2 y 0
2001 a 2 z 0
2001 a 2 w 0
2001 a 3 w 1
2001 a 3 y 1
2001 b 1 x 0
2001 b 1 y 0
2001 b 2 z 1
2001 b 2 x 1
你可以查看演示here
希望这会有所帮助。
我不熟悉 hql,但快速 Google 搜索显示它是 "similar" 到 SQL 但它是面向对象的。在您的问题中,您必须更新标准的关系 Oracle table,因此不清楚您为什么需要或想要使用 hql。
如果您可以使用简单的 SQL 语句访问 Oracle 数据库,则可以使用 MERGE 语句执行更新,如下所示:(假设 td
是名称你的 table)
merge into td
using ( select c1, c2, max(c3) as max_c3
from td
group by c1, c2
) x
on (td.c1 = x.c1 and td.c2 = x.c2 and td.c3 = max_c3)
when matched then update
set c5 = 1
;
我想根据 c1、c2、c3 列更新每个分组数据的 c5 列(到 1),其中 c3 在同一个 c1、c2 中最大 group.I 我正在使用 sql on oracle db
c1 | c2 | c3 | c4 | c5 | c5 after update
2000 | a | 01 | x | 0 | 0
2000 | a | 01 | y | 0 | 0
2000 | a | 01 | z | 0 | 0
2000 | a | 02 | z | 0 | 1
2000 | a | 02 | x | 0 | 1
...........................
2000 | b | 01 | x | 0 | 0
2000 | b | 01 | y | 0 | 0
2000 | b | 01 | z | 0 | 0
2000 | b | 02 | z | 0 | 1
..........................
..........................
2001 | a | 01 | x | 0 | 0
2001 | a | 01 | y | 0 | 0
2001 | a | 01 | z | 0 | 0
2001 | a | 02 | z | 0 | 0
2001 | a | 02 | x | 0 | 0
2001 | a | 02 | y | 0 | 0
2001 | a | 02 | w | 0 | 0
2001 | a | 03 | y | 0 | 1
2001 | a | 03 | w | 0 | 1
...........................
2001 | b | 01 | x | 0 | 0
2001 | b | 01 | y | 0 | 0
2001 | b | 02 | x | 0 | 1
2001 | b | 02 | z | 0 | 1
您可以使用 windows 聚合函数 max
按列 c1
、c2
在 case
中对其进行分区,如下所示,以生成您想要的结果。
SELECT t2.c1,
t2.c2,
t2.c3,
t2.c4,
CASE
WHEN t2.c3 = max(t2.c3) over(partition BY t2.c1, t2.c2
ORDER BY t2.c1) THEN 1
ELSE 0
END AS c5
FROM table1 t2
ORDER BY t2.c1,
t2.c2,
t2.c3
结果
C1 C2 C3 C4 C5
-----------------------
2000 a 1 x 0
2000 a 1 y 0
2000 a 1 z 0
2000 a 2 z 1
2000 a 2 x 1
2000 b 1 x 0
2000 b 1 y 0
2000 b 1 z 0
2000 b 2 z 1
2001 a 1 x 0
2001 a 1 y 0
2001 a 1 z 0
2001 a 2 x 0
2001 a 2 y 0
2001 a 2 z 0
2001 a 2 w 0
2001 a 3 w 1
2001 a 3 y 1
2001 b 1 x 0
2001 b 1 y 0
2001 b 2 z 1
2001 b 2 x 1
你可以查看演示here
希望这会有所帮助。
我不熟悉 hql,但快速 Google 搜索显示它是 "similar" 到 SQL 但它是面向对象的。在您的问题中,您必须更新标准的关系 Oracle table,因此不清楚您为什么需要或想要使用 hql。
如果您可以使用简单的 SQL 语句访问 Oracle 数据库,则可以使用 MERGE 语句执行更新,如下所示:(假设 td
是名称你的 table)
merge into td
using ( select c1, c2, max(c3) as max_c3
from td
group by c1, c2
) x
on (td.c1 = x.c1 and td.c2 = x.c2 and td.c3 = max_c3)
when matched then update
set c5 = 1
;