02 删除重复值

SQL Server

目的:每个人员可能对应多种物品,每种物品有多个品牌,我们按照人员物品分类,只保留一个品牌(随机)

源表:

02 删除重复值

CREATE TABLE Personal_Items(
姓名 VARCHAR(30) NOT NULL,
物品 VARCHAR(30) NULL,
品牌 VARCHAR(30) NULL
)
INSERT INTO Personal_Items
VALUES
('张三','电脑','华为'),
('张三','手机','华为'),
('张三','手机','小米'),
('李四','手表','华为'),
('李四','手表','苹果')

 

 

 

Step1:利用窗口函数语句按需要保持唯一值的字段分组标记行Id

注意:没有ORDER BY的话,运行会报错

SELECT *,
       ROW_NUMBER() OVER(PARTITION BY 姓名,物品 ORDER BY 品牌) AS Id
FROM Personal_Items

02 删除重复值

 

 

Step2:根据Id选择需要的结果

SELECT * FROM (
SELECT *,
       ROW_NUMBER() OVER(PARTITION BY 姓名,物品 ORDER BY 品牌) AS Id
FROM Personal_Items) AS A
WHERE A.Id=1

02 删除重复值

 

 

补充知识:SQL四大排名函数

以学生成绩排名为例

(1)ROW_NUMBER()

将SELECT查询到的数据进行排序,当存在成绩相同的学生时,ROW_NUMBER()会依次进行排序,他们序号不相同。

ROW_NUMBER()函数必须与ORDER BY一起使用。

(2)RANK()

成绩相同的学生,他们的排名是一样的。RANK()排名是跳跃的。

(3)DENSE_RANK()

成绩相同的学生,他么的排名是一样的。DENSE_RANK()排名是连续的。

(4)NTILE()

NTILE()函数是将有序分区中的行分发到指定数目的组中,各个组有编号,编号从1开始,就像我们说的'分区'一样 ,分为几个区,一个区会有多少个。

SELECT *,NTILE(2) OVER(ORDER BY SCORE DESC) AS 分区后排序 FROM Scores

 

上一篇:Swagger2工具小结


下一篇:方法案例二:判断奇偶性