Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/375.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
Java 根据特殊组hql中列的最大值有条件地更新_Java_Sql_Oracle_Hibernate_Hql - Fatal编程技术网

Java 根据特殊组hql中列的最大值有条件地更新

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

我想将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
...........................
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:粘贴的查询将不起作用。合并将根据您的要求完美工作。