代码之家  ›  专栏  ›  技术社区  ›  user3040157

如何根据列的不同值使用ROW_NUMBER()OVER值更新列值

  •  0
  • user3040157  · 技术社区  · 9 年前

    我有一个表,希望在其中更新特定列的值。列值应为行号。根据列的不同值,我需要更新新创建的列值。

    例子:

    的内容 INFO_T 表格:

    Name   | id 
    ------------
    Arijit | 120
    Suman  | 240
    Priyam | 555
    Arijit | 456
    Suvayu | 110
    Priyam | 300
    

    我需要在上表中再添加一列 信息T ,以下是示例。我必须使用 ROW_NUMBER() OVER 函数,通过它我必须更新 SEQ_NO

    Name   | id  | Seq_no
    ------------------
    Arijit | 120 | 1
    Suman  | 240 | 2
    Priyam | 555 | 3
    Arijit | 120 | 1
    Suvayu | 110 | 4
    Priyam | 555 | 3
    

    如何获得上述结果?

    3 回复  |  直到 8 年前
        1
  •  1
  •   Gordon Linoff    9 年前

    您可以使用 dense_rank() 为此目的:

    select name, id, dense_rank() over (order by minid) as seqno
    from (select t.*, min(id) over (partition by name) as minid
          from table t
         ) t;
    

    如果你想这样做 row_number() :

    select t.name, t.id, tt.seqnum
    from table t join
         (select t.name, row_number() over (order by min(id)) as seqno
          from table t
          group by t.name
         ) tt
         on t.name = tt.name;
    

    然而,我不知道你为什么要这样做。

        2
  •  1
  •   Juan Carlos Oropeza    9 年前

    SQL FIDDLE DEMO

    SELECT Table1.name, Table1.ID, SEQ.Seq_no
    FROM 
        (SELECT name, ROW_NUMBER() OVER(order by name) as Seq_no
         FROM (SELECT  DISTINCT name FROM Table1) as unique_name ) as SEQ INNER JOIN
         Table1 on SEQ.name = Table1.Name
    
        3
  •  0
  •   TLaV    9 年前

    这是MS SQL,但看起来Row_Number在Oracle中的功能相同。如果不能执行CTE(WITH)语句,则可以将其作为子查询来执行。也许有Oracle SQL经验的人可以使用此示例并重新编写。我不能保证结果,因为它们是无序的,但基本上我首先从表中创建一个RowID,没有顺序。这使我能够确保名称的顺序与您的顺序相同(这似乎是插入顺序)。然后我基本上进行了子查询,以按顺序获得每个名称的第一个不同实例。然后我又回到了原来的桌子上。在这里 SQLFiddle .

    ;WITH NoOrderBy AS
    (
      select Row_Number() OVER(ORDER BY (SELECT 0)) RowID,Name,id
      FROM MyTable
    ),
    DistinctNames  AS
    (
      SELECT Row_Number() OVER(ORDER BY RowID) RowID3,Name,RowID,id
      FROM
      (
        SELECT Row_Number() OVER(PARTITION BY NAME ORDER BY RowID) RowID2,Name,RowID,id
        FROM NoOrderBy
       ) a
       WHERE RowID2 = 1
    )
    SELECT mt.Name,di.id,di.RowID3 Seq_no 
    FROM MyTable mt
    INNER JOIN DistinctNames di
    ON mt.Name =di.Name