Sql 基于两列的行数

Sql 基于两列的行数,sql,sql-server,sql-server-2017,Sql,Sql Server,Sql Server 2017,我期待着尝试创建下面的行号,我已经尝试了这么多的选项,但似乎没有工作。我会很感激你的帮助 我想让行顺序看看sub_id,并为每个行做一个序列号,1,2,3。。。然后我想让它看看光盘,如果改变了,再回到1。我曾尝试将它们连接起来并使用一个键,但似乎无法使其工作 ID sub_id disc ROW_NUMBER 1 1 OT 1 1 1 OT 2 1 1 OT 3 1 2 DT

我期待着尝试创建下面的行号,我已经尝试了这么多的选项,但似乎没有工作。我会很感激你的帮助

我想让行顺序看看sub_id,并为每个行做一个序列号,1,2,3。。。然后我想让它看看光盘,如果改变了,再回到1。我曾尝试将它们连接起来并使用一个键,但似乎无法使其工作

ID  sub_id  disc    ROW_NUMBER
1     1      OT       1
1     1      OT       2
1     1      OT       3
1     2      DT       1
1     2      DT       2
1     3      SL       1
1     3      SL       2
1     4      PH       1
1     4      PH       2
1     4      OT       1
1     5      OT       1
1     5      PH       2
1     5      DT       1
1     6      DT       1
1     6      DT       2
1     6      DT       3
1     7      SL       1
1     7      SL       2
1     7      DT       1
1     8      SL       1
1     8      SL       2
1     8      SL       3
1     9      DT       1
1     9      DT       2
1     9      DT       3
1     10     PH       1
1     10     DT       1
1     10     DT       2
1     11     OT       1
1     11     OT       2
1     11     OT       3
1     12     OT       1
1     12     OT       2
1     12     OT       3
更新 (按子id顺序按磁盘分区)上的行号()不起作用。当sub_id更改为2时,排序出错。此时,它需要恢复为1,但它是2。

您似乎想要:

row_number() over (partition by id, sub_id, disc order by id)

注意:您没有指定列顺序的列,甚至没有唯一标识每一行的列。因此,这只使用了按id排序的
。您可能希望在此处添加其他专栏。

“我尝试了许多选项,但似乎都不起作用”这些尝试是什么,您在问题中忽略了它们?您还标记了两个完全不同的RDBMS,您真正使用的是什么,MySQL还是SQL Server?我已经删除了相互冲突的标签。请重新标记您实际使用的产品。这与Gordon的答案有何不同?我已经试过了,但不起作用。当子ID变为2时,行号变为2,而不是1。当我使用相同的数据(ID、子ID、光盘)时,我得到了你想要的行号。我将数据插入到一个表中,得到了与你在问题中公布的结果相同的结果,与Larnu的回答不同:我们在同一时间写的-他在我之前公布,我按照要求的问题填写了所有栏目。我在数据集中使用SQL 2012,没有特定的顺序,因此我按ID、子ID、光盘的顺序进行排序。这不行,我以前试过。请参阅下面的评论。@BeckyPurland。请说明这在db/sql小提琴中是如何工作的。它似乎正是你想要的。我不知道什么是db/sql小提琴。我把代码完全按照贴出来的那样放进去了,答案和我的问题不一样。它是1,2,3,2,3,1,3。这不是我所需要的。我试着将sub_id和disc连接起来,然后在上面使用row_number()(按键顺序按键划分),得到了相同的答案。@BeckyPurland。至少编辑问题并将表创建和插入语句放在那里,以便数据可以轻松复制。数据已经在表中,我正在查询表,因此不需要创建表并插入数据。我只是想创建一个row_number或rank语句来完成我需要它做的事情,但这似乎是一个不可能完成的任务。
SELECT ID , sub_ID , disc , ROW_NUMBER() OVER (PARTITION BY sub_ID ORDER BY disc)   from your table