Sql 如何根据列的不同值将列值的行数()更新到值的上方

Sql 如何根据列的不同值将列值的行数()更新到值的上方,sql,oracle,window-functions,row-number,Sql,Oracle,Window Functions,Row Number,我有一个表,我想在其中更新特定列的值。列值应为行号。根据列的不同值,我需要更新新创建的列值 例如: INFO\u T表格的内容: Name | id ------------ Arijit | 120 Suman | 240 Priyam | 555 Arijit | 456 Suvayu | 110 Priyam | 300 我需要在上表INFO\u T中再添加一列,下面是示例。我必须使用ROW_NUMBER()OVER函数,通过它我必须更新SEQ_NO列 Name | id

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

例如:

INFO\u T
表格的内容:

Name   | id 
------------
Arijit | 120
Suman  | 240
Priyam | 555
Arijit | 456
Suvayu | 110
Priyam | 300
我需要在上表
INFO\u 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
如何获得上述结果?


为此,您可以使用
densite\u 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;
如果您只想使用
行编号()


但是,我不知道您为什么要这样做。

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


您使用的是哪种数据库管理系统?博士后?Oracle?请您解释一下如何分配序列号以获得结果?例如,按名称升序排列所有行,然后将行号应用于每个名称的不同实例?或者按ID升序排列所有行,然后将行号应用于每个名称的不同实例?我不知道你是怎么做到的,因为它看起来不像是字母顺序,也不像是与id相关。我用的是Oracle SQL Developer。抱歉之前的信息。我已经更新了。请检查一下。我无法获得您想要的确切输出,因为rownum()将SEQ id按名称排序放在首位。这是个问题吗?您可以在我的回答中进行注释。如果我在“名称”列中使用了distinct关键字,那么该值应该是distinct的。执行此操作后,如果我使用row_number()函数输入seq_no,则该列具有唯一id。它不仅没有回答问题,而且没有提供正确的数字。@ZoharPeled立即修复它不是真的。在发布答案之前,你最好先看看小提琴的演奏结果……@ZoharPeled我认为没问题,每个名字都有一个唯一的ID。我无法获得OP所需的精确输出,因为SQL不保证排序,除非您使用
orderby
。如果您仍然看到一些错误,请告诉我,我会尝试修复。嗨,Juan,我希望更新查询插入序号。您能帮助我吗。您好Gordon,第二次选择应该是
tt.seqno
。我也不认为这有什么关系,但在我的查询和你的查询中,
rownumber()
按名称排序,因此我无法获得确切的输出作为OP。你知道如何修复它吗?你可以看到我的小提琴。我想这是做不到的,因为sql不能保证任何排序,除非你使用
orderby
@JuanCarlosOropeza。数据中需要有一列指定顺序。
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;
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;
;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