oracle 查询,将每个组的其余行的列值替换为该列的第一行

tnkciper  于 2023-08-04  发布在  Oracle
关注(0)|答案(2)|浏览(160)

数据如下表所示。

brnach_id  branch_loc branch_name
1222         HYD        COMPUTER
1222         HYD        NULL
1222         HYD        COMPUTER
1222         HYD        NULL
1222         HYD        NULL
1333         BLR        ENGINEERING
1333         HYD        NULL
1333         BLR        NULL
1333         CHI        NULL
1444         PUN        MARKETING
1444         HYD        NULL

字符串
对于每个分支_id,我希望将branch_name列的值替换为其余行的第一行。
预期输出为

brnach_id  branch_loc branch_name
1222         HYD        COMPUTER
1222         HYD        COMPUTER
1222         HYD        COMPUTER
1222         HYD        COMPUTER
1222         HYD        COMPUTER
1333         BLR        ENGINEERING
1333         HYD        ENGINEERING
1333         BLR        ENGINEERING
1333         CHI        ENGINEERING
1444         PUN        MARKETING
1444         HYD        MARKETING


先谢谢你。

mrzz3bfm

mrzz3bfm1#

您可以将FIRST_VALUE函数与IGNORE NULLS一起使用,例如

SELECT branch_id, branch_loc,
       FIRST_VALUE(branch_name) IGNORE NULLS OVER (PARTITION BY branch_id) AS branch_name
  FROM t

字符串
无论branch_name列如何按照每个branch_id值排序

brc7rcf0

brc7rcf02#

在SQL(不仅仅是Oracle SQL)中,结果集是无序的,除非您指定ORDER BY子句为它们提供顺序。在您的例子中,没有什么明显的东西可以确定是什么使一行成为“第一”行。
让我们假设有这样一种方法来识别行,并且它位于id列中,而您没有显示;然后,从Oracle 12中,您可以用途:

UPDATE table_name t
SET branch_name = ( SELECT branch_name
                    FROM   table_name m
                    WHERE  m.branch_id = t.branch_id
                    ORDER BY id ASC                   -- specify an order
                    FETCH FIRST ROW ONLY );

字符串
如果你没有办法对行进行排序,并希望MIN最大值作为“第一”(这可能不是你在显示器上看到的第一行),那么:

UPDATE table_name t
SET branch_name = ( SELECT MIN(branch_name)
                    FROM   table_name m
                    WHERE  m.branch_id = t.branch_id );


如果您不想替换(UPDATE)表中的值,而只想更改显示的内容,则可以用途:

SELECT branch_id,
       branch_loc,
       FIRST_VALUE(branch_name) OVER (PARTITION BY branch_id ORDER BY id) AS branch_name
FROM   table_name;


或者,如果您没有可以排序的列,并且需要最小值:

SELECT branch_id,
       branch_loc,
       MIN(branch_name) OVER (PARTITION BY branch_id) AS branch_name
FROM   table_name;


fiddle

相关问题