Sql server 基于其他列的值的动态标识

Sql server 基于其他列的值的动态标识,sql-server,row-number,Sql Server,Row Number,我正在创建一个表,例如学生姓名、班级、卷号 卷号设置为身份,学生信息保存在表中,如学生姓名、班级、卷号 我想要这样的 Student Name Class Roll No Snehal 1 1 Alok 1 2 Sandeep 1 3 Swapnil 1 4 Kunal 1 5 Amit 1

我正在创建一个表,例如学生姓名、班级、卷号

卷号设置为身份,学生信息保存在表中,如学生姓名、班级、卷号

我想要这样的

Student Name    Class   Roll No
   Snehal         1      1
    Alok          1      2
   Sandeep        1      3
  Swapnil         1      4
   Kunal          1      5
   Amit           1      6
  Nitin           2      1
 Sudhanshu        2      2
  Lokesh          1      7
  Swati           2      3
  Rajesh          1      8

我希望,当我插入任何人名并输入第1类时,其卷号应自动为9;当我插入任何姓名并输入第2类时,卷号应为4;如果我输入带有第3类的人名,则其卷号应从1开始,因为它是第3类第一记录,然后输入人名并输入第1类10如果您希望以这种方式使用identity函数,请尽快建议我使用“死硬状态”

您只需使用SQL Server函数按
类创建分区即可。这将有效地按类列对结果进行排序,并为
RollNo
提供一个顺序值,直到类更改为止

SQL架构设置:

CREATE TABLE StudentClass
    ([Student Name] varchar(9), [Class] int)
;

INSERT INTO StudentClass
    ([Student Name], [Class])
VALUES
    ('Snehal', 1),
    ('Alok', 1),
    ('Sandeep', 1),
    ('Swapnil', 1),
    ('Kunal', 1),
    ('Amit', 1),
    ('Nitin', 2),
    ('Sudhanshu', 2),
    ('Lokesh', 1),
    ('Swati', 2),
    ('Rajesh', 1)
;
SELECT  * ,
        ROW_NUMBER() OVER ( PARTITION BY Class ORDER BY Class ) AS RollNo
FROM    StudentClass
Student Name    Class   RollNo
===============================
Snehal              1       1
Alok                1       2
Sandeep             1       3
Swapnil             1       4
Kunal               1       5
Amit                1       6
Lokesh              1       7
Rajesh              1       8
Swati               2       1
Nitin               2       2
Sudhanshu           2       3
使用
行号()选择SQL:

CREATE TABLE StudentClass
    ([Student Name] varchar(9), [Class] int)
;

INSERT INTO StudentClass
    ([Student Name], [Class])
VALUES
    ('Snehal', 1),
    ('Alok', 1),
    ('Sandeep', 1),
    ('Swapnil', 1),
    ('Kunal', 1),
    ('Amit', 1),
    ('Nitin', 2),
    ('Sudhanshu', 2),
    ('Lokesh', 1),
    ('Swati', 2),
    ('Rajesh', 1)
;
SELECT  * ,
        ROW_NUMBER() OVER ( PARTITION BY Class ORDER BY Class ) AS RollNo
FROM    StudentClass
Student Name    Class   RollNo
===============================
Snehal              1       1
Alok                1       2
Sandeep             1       3
Swapnil             1       4
Kunal               1       5
Amit                1       6
Lokesh              1       7
Rajesh              1       8
Swati               2       1
Nitin               2       2
Sudhanshu           2       3
输出:

CREATE TABLE StudentClass
    ([Student Name] varchar(9), [Class] int)
;

INSERT INTO StudentClass
    ([Student Name], [Class])
VALUES
    ('Snehal', 1),
    ('Alok', 1),
    ('Sandeep', 1),
    ('Swapnil', 1),
    ('Kunal', 1),
    ('Amit', 1),
    ('Nitin', 2),
    ('Sudhanshu', 2),
    ('Lokesh', 1),
    ('Swati', 2),
    ('Rajesh', 1)
;
SELECT  * ,
        ROW_NUMBER() OVER ( PARTITION BY Class ORDER BY Class ) AS RollNo
FROM    StudentClass
Student Name    Class   RollNo
===============================
Snehal              1       1
Alok                1       2
Sandeep             1       3
Swapnil             1       4
Kunal               1       5
Amit                1       6
Lokesh              1       7
Rajesh              1       8
Swati               2       1
Nitin               2       2
Sudhanshu           2       3

您使用什么RDBMS?请用它添加标记。查看编辑后,为什么需要存储此值?每行可以有一个唯一的id和一个标准id列,并且在返回数据时可以得到每个类的卷号。也许你应该考虑一个由学生ID列和类ID组成的组合键,这将是一个独特的组合。您试图解决的实际问题是什么?实际上,我正在设计一个应用程序,在该应用程序中,我将向我们的客户显示客户信息,然后从我们的客户端,他们将根据这些信息进入客户类别,并且可以有多个类别。所以我的要求是,我有两列class和serial_No_InClass,所以我希望无论何时添加一个现有类,标识都应该递增1,如果输入一个新类,其标识应该从1开始,然后再次输入一个现有类,那么该编号应该大于这个录音谢谢兄弟,我得到了iSI@ KunalChoudhary。如果这个答案解决了你的问题,请考虑点击复选标记。这向更广泛的社区表明,你已经找到了一个解决方案,并给回答者和你自己带来了一些声誉。没有义务这样做。