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。如果这个答案解决了你的问题,请考虑点击复选标记。这向更广泛的社区表明,你已经找到了一个解决方案,并给回答者和你自己带来了一些声誉。没有义务这样做。