DBMNG数据库管理与应用

科学是实事求是的学问,来不得半点虚假。
当前位置:首页 > SQLServer > 应用案例

SQLServer如何去掉部分字段重复数据?

需求:某个表的数据,希望得到手机号去重复之后的记录,重复取时间较早的数据……

[sql] 
  1. --0. 定义表变量及初始数据  
  2. set nocount on  
  3. declare @t table(  
  4.     mobile varchar(11),  
  5.     loadTime datetime  
  6. )  
  7. --1   单条   
  8. --2,3 两条,号码和时间完全相同  
  9. --4,5 两条,号码同,时间不同  
  10. insert into @t (mobile, loadTime) values('13212345670','2014-04-05')  
  11. insert into @t (mobile, loadTime) values('13212345671','2014-03-02')  
  12. insert into @t (mobile, loadTime) values('13212345671','2014-03-02')  
  13. insert into @t (mobile, loadTime) values('13212345672','2014-02-03')  
  14. insert into @t (mobile, loadTime) values('13212345672','2014-03-04')  
  15.   
  16. --1. row_number 同一号码,无论时间是否相同 rid都不会重复  
  17. select row_number() over(partition by mobile order by loadtime) as rid, * from @t ORDER BY mobile,loadTime  
  18. /*  
  19.                  rid mobile      loadTime  
  20. -------------------- ----------- -----------------------  
  21.                    1 13212345670 2014-04-05 00:00:00.000  
  22.                    1 13212345671 2014-03-02 00:00:00.000  
  23.                    2 13212345671 2014-03-02 00:00:00.000  
  24.                    1 13212345672 2014-02-03 00:00:00.000  
  25.                    2 13212345672 2014-03-04 00:00:00.000  
  26. */  
  27. --2. rank 同一号码, 同一时间 rid会重复; 同一号码 不同时间 rid 不会重复  
  28. select rank() over(partition by mobile order by loadtime) as rid, * from @t ORDER BY mobile,loadTime  
  29. /*  
  30.                  rid mobile      loadTime  
  31. -------------------- ----------- -----------------------  
  32.                    1 13212345670 2014-04-05 00:00:00.000  
  33.                    1 13212345671 2014-03-02 00:00:00.000  
  34.                    1 13212345671 2014-03-02 00:00:00.000  
  35.                    1 13212345672 2014-02-03 00:00:00.000  
  36.                    2 13212345672 2014-03-04 00:00:00.000  
  37. */  
  38. --3. 只能选择 row_number 来去重复……  
  39. ;with t as (  
  40.     select row_number() over(partition by mobile order by mobile,loadtime) as rid, * from @t  
  41. )  
  42. select * from t where rid=1  ORDER BY mobile,loadTime  
  43. /*  
  44.                  rid mobile      loadTime  
  45. -------------------- ----------- -----------------------  
  46.                    1 13212345670 2014-04-05 00:00:00.000  
  47.                    1 13212345671 2014-03-02 00:00:00.000  
  48.                    1 13212345672 2014-02-03 00:00:00.000  
  49. */  
本站文章内容,部分来自于互联网,若侵犯了您的权益,请致邮件chuanghui423#sohu.com(请将#换为@)联系,我们会尽快核实后删除。
Copyright © 2006-2023 DBMNG.COM All Rights Reserved. Powered by DEVSOARTECH            豫ICP备11002312号-2

豫公网安备 41010502002439号