根据特殊组 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 按列 c1c2case 中对其进行分区,如下所示,以生成您想要的结果。

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
;