SQL Server
目的:每个人员可能对应多种物品,每种物品有多个品牌,我们按照人员物品分类,只保留一个品牌(随机)
源表:
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
Step2:根据Id选择需要的结果
SELECT * FROM ( SELECT *, ROW_NUMBER() OVER(PARTITION BY 姓名,物品 ORDER BY 品牌) AS Id FROM Personal_Items) AS A WHERE A.Id=1
补充知识: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