Sql 从另一个表插入数据时按多列分区

Sql 从另一个表插入数据时按多列分区,sql,sql-server,sql-insert,greatest-n-per-group,Sql,Sql Server,Sql Insert,Greatest N Per Group,如何跳过SQL Server中的唯一约束错误 这是我的源表: 创建表源 没有整数, Nam VARCHAR6, 性别问题1, 分数整数 ; 插入源RollNo、Nam、性别、分数 值“101”、“John”、“M”、“85”, “102”,“特雷西”,“F”,“79”, “103”,“杰克”,“M”,“92”, “104”,“埃德加”,“M”,空, “105”,“莫妮卡”,“F”,“25”, “106”,“Monica”,“F”,“50”, ‘1070’、‘Yash’、‘M’、‘68’, ‘10

如何跳过SQL Server中的唯一约束错误

这是我的源表:

创建表源 没有整数, Nam VARCHAR6, 性别问题1, 分数整数 ; 插入源RollNo、Nam、性别、分数 值“101”、“John”、“M”、“85”, “102”,“特雷西”,“F”,“79”, “103”,“杰克”,“M”,“92”, “104”,“埃德加”,“M”,空, “105”,“莫妮卡”,“F”,“25”, “106”,“Monica”,“F”,“50”, ‘1070’、‘Yash’、‘M’、‘68’, ‘107’、‘Yash’、‘M’、‘70’, ‘108’、‘SFS’、‘M’、‘68’, ‘18’、‘SFS77’、‘F’、‘65’; 我希望从源表填充dest表,其中name&Gender是唯一键,SeqNo应自动递增:

dest表说明:

创建表dest SeqNo BIGINT IDENTITY1000,1主键, 没有整数, Nam VARCHAR6, 性别问题1, 分数整数 ; 以下是我尝试过的:

尝试1:

插入dest RollNo、Nam、性别、分数 选择 第一个值不按Nam划分,按分数描述的性别顺序, 根据Nam划分的第一个值Nam,根据分数描述的性别顺序, 第一_值Nam划分的性别,分数描述的性别顺序, 按Nam划分的第一个值得分,按得分描述的性别顺序 从…起 来源 哪里 Nam不为空,性别不为空; 错误:违反唯一密钥约束

尝试2:

插入dest RollNo、Nam、性别、分数 选择MAXRollNo、Nam、性别、MAXScore 来源 不结盟运动分组,性别 按MAXScore DESC排序; 输出:

| SeqNo | RollNo |    Nam | Gender |  Score |
|-------|--------|--------|--------|--------|
|  1000 |    103 |   Jake |      M |     92 |
|  1001 |    101 |   John |      M |     85 |
|  1002 |    102 |  Tracy |      F |     79 |
|  1003 |   1070 |   Yash |      M |     70 |
|  1004 |    108 |    SFS |      M |     68 |
|  1005 |     18 |  SFS77 |      F |     65 |
|  1006 |    106 | Monica |      F |     50 |
|  1007 |    104 |  Edgar |      M | (null) |
如果你看到亚什的那一排,那就是罗尔诺的马克斯。最大分数是错误的,我希望它取第一个值,但我不知道怎么做


是否有其他方法可以排除上述两种方法?

您可以识别具有行号的每个Nam/SEXT元组得分最高的行,并使用该信息过滤源数据:

INSERT INTO dest (RollNo, Nam, Gender, Score) 
SELECT RollNo, Nam, Gender, Score
FROM (
    SELECT s.*,
        ROW_NUMBER() OVER(PARTITION BY Nam, Gender ORDER BY Score DESC) rn
    FROM source s
) s
WHERE rn = 1
旁注:我建议对目标表中的Nam/SEXT元组设置一个唯一约束,以便在插入时始终拒绝潜在的重复项:

CREATE TABLE dest (
  SeqNo  BIGINT IDENTITY(1000,1) PRIMARY KEY,
  RollNo INTEGER,
  Name   VARCHAR(6),
  Gender VARCHAR(1),
  Score  INTEGER,
  UNIQUE (Name, Gender)
);

旁注2:不要在列名周围加单引号;它们代表标准SQL中的文字字符串。

您可以识别具有行号的每个Nam/SEXT元组得分最高的行,并使用该信息过滤源数据:

INSERT INTO dest (RollNo, Nam, Gender, Score) 
SELECT RollNo, Nam, Gender, Score
FROM (
    SELECT s.*,
        ROW_NUMBER() OVER(PARTITION BY Nam, Gender ORDER BY Score DESC) rn
    FROM source s
) s
WHERE rn = 1
旁注:我建议对目标表中的Nam/SEXT元组设置一个唯一约束,以便在插入时始终拒绝潜在的重复项:

CREATE TABLE dest (
  SeqNo  BIGINT IDENTITY(1000,1) PRIMARY KEY,
  RollNo INTEGER,
  Name   VARCHAR(6),
  Gender VARCHAR(1),
  Score  INTEGER,
  UNIQUE (Name, Gender)
);

旁注2:不要在列名周围加单引号;它们代表标准SQL中的文字字符串。

感谢您的帮助。实际上,我是SQL方面的新手。它按预期工作,但我必须删除s.*。你能解释一下为什么吗@HarshitMahajan:缺少表别名。修好了。谢谢你的帮助。实际上,我是SQL方面的新手。它按预期工作,但我必须删除s.*。你能解释一下为什么吗@HarshitMahajan:缺少表别名。已修复。几天前您正在使用MySQL。您真的确定您正在使用SQL Server吗?这些都有不同的语法规则。几天前你在使用MySQL。您真的确定您正在使用SQL Server吗?它们有不同的语法规则。