Java 根据特殊组hql中列的最大值有条件地更新
我想将c5列更新为c1、c2、c3列上每个分组日期基的第1列,其中c3是同一c1、c2组中的最大值Java 根据特殊组hql中列的最大值有条件地更新,java,sql,oracle,hibernate,hql,Java,Sql,Oracle,Hibernate,Hql,我想将c5列更新为c1、c2、c3列上每个分组日期基的第1列,其中c3是同一c1、c2组中的最大值 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
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对其进行分区,如下所示,以生成所需的结果
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
结果
你可以查看演示
希望这会有所帮助。您可以使用windows聚合函数max按c1、c2列对其进行分区,如下所示,以生成所需的结果
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
结果
你可以查看演示
希望这会有所帮助。我对hql不太熟悉,但快速的谷歌搜索显示它与SQL相似,但它是面向对象的。在您的问题中,您必须更新一个标准的关系型Oracle表,因此不清楚您为什么需要或想要使用hql 如果您可以使用简单的SQL语句访问Oracle数据库,则可以使用MERGE语句执行更新,如下所示:假设td是表的名称
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
;
我不熟悉hql,但快速的Google搜索显示它与SQL相似,但它是面向对象的。在您的问题中,您必须更新一个标准的关系型Oracle表,因此不清楚您为什么需要或想要使用hql 如果您可以使用简单的SQL语句访问Oracle数据库,则可以使用MERGE语句执行更新,如下所示:假设td是表的名称
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
;
非常感谢。我想要hql,但我认为我不能用hql编写,必须使用sql作为您的答案…但是您可以编辑您的答案,将c5更新为特定的数字0或1吗?我不想选择…我想更新。我错过了更新部分。正如上面mathguy已经写的,所以你可以检查一下。这对您来说是可行的,但是您需要在ddl中将列c5设置为默认值0。所以我不能使用您的查询并进行一些修改以进行更新?这样如何?更新表1 t3集合t3.c5=当t2.c3=最大t2.c3超出t2.c1时选择案例,t2.c2顺序超出t2.c1,然后1其他0结束为c6,从表1 t2顺序超出t2.c1,t2.c2,t2。c3@faraa:粘贴的查询将不起作用。合并将根据您的要求完美工作。非常感谢。我想要hql,但我想我不能用hql编写它,必须使用sql作为您的答案…但您可以编辑您的答案以将c5更新为特定的数字0或1吗?我不想选择…我想更新。我错过了更新部分。正如上面mathguy已经写的,所以你可以检查一下。这对您来说是可行的,但是您需要在ddl中将列c5设置为默认值0。所以我不能使用您的查询并进行一些修改以进行更新?这样如何?更新表1 t3集合t3.c5=当t2.c3=最大t2.c3超出t2.c1时选择案例,t2.c2顺序超出t2.c1,然后1其他0结束为c6,从表1 t2顺序超出t2.c1,t2.c2,t2。c3@faraa:粘贴的查询将不起作用。合并将根据您的要求完美工作。