标签:02 删除 重复 Items NUMBER Id ORDER SELECT ROW
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
标签:02,删除,重复,Items,NUMBER,Id,ORDER,SELECT,ROW 来源: https://www.cnblogs.com/yongzhao/p/15849604.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。