首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Oracle -表中基于列的排序

Oracle -表中基于列的排序
EN

Stack Overflow用户
提问于 2017-04-09 17:25:31
回答 4查看 719关注 0票数 0

我有一个包含列的表customer_order

代码语言:javascript
复制
ORD_ID, AI_LN, ITEM

数据如下所示

代码语言:javascript
复制
A100 null 001232
A100 null 108632
A100 null 501632
A200 null 301632
A200 null 601732

我需要根据订单对AI_LN进行编号,这样它就变成

代码语言:javascript
复制
A100 0 001232
A100 1 108632
A100 2 501632
A200 0 301632
A200 1 601732

如何做到这一点?它会是通过PLSQL块实现的吗?

EN

回答 4

Stack Overflow用户

发布于 2017-04-09 17:51:49

如果您只想选择给定的ai_ln,您可以使用select中的窗口函数:

代码语言:javascript
复制
select ord_id,
    row_number() over (
        partition by ord_id order by item
        ) - 1 as ai_ln,
    item
from your_table;

如果要用它更新表,可以在merge语句中使用它。

代码语言:javascript
复制
merge into your_table t
using (
    select ord_id,
        row_number() over (
            partition by ord_id order by item
            ) - 1 as ai_ln,
        item
    from your_table
    ) s
    on (s.rowid = t.rowid)
when matched
    then
        update
        set t.ai_ln = s.ai_ln;
票数 1
EN

Stack Overflow用户

发布于 2017-04-09 17:46:50

不需要使用PL/ SQL,这可以在SQL中使用ROW_NUMBER分析函数来完成:

代码语言:javascript
复制
SELECT ORD_ID,
       ROW_NUMBER() OVER ( PARTITION BY ORD_ID
                           ORDER BY ITEM ) -- or ORDER BY ROWNUM
         AS ai_ln,
       ITEM
FROM   customer_order;

如果要更新表,请执行以下操作:

代码语言:javascript
复制
UPDATE customer_table c
SET ai_ln = (
  SELECT rn
  FROM   (
    SELECT ROW_NUMBER() OVER ( PARTITION BY ord_id
                               ORDER BY item )
             AS rn
    FROM   customer_table
  ) r
  WHERE c.ROWID = r.ROWID
);

MERGE

代码语言:javascript
复制
MERGE INTO customer_table dst
USING ( SELECT ROW_NUMBER() OVER ( PARTITION BY ord_id
                                   ORDER BY item ) AS rn
        FROM   customer_table ) src
ON ( dst.ROWID = src.ROWID )
WHEN MATCHED THEN
  UPDATE SET ai_ln = src.rn;
票数 0
EN

Stack Overflow用户

发布于 2017-04-09 17:49:08

使用row_number()解析函数:

代码语言:javascript
复制
select ORD_ID
     , row_number() over(partition by ORD_ID order by ITEM ) -1 as AI_LN
     , ITEM
  from table;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43305110

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档