Excel批量导入如何做数据去重
2015-12-12 15:27
681 查看
大数据量总是离不开数据去重,去重分为几种类型,有些是部分字段相同,有些是全部字段相同,那么应该如何做到高效去除重复呢?
小编在这里简单介绍两种去重方式,一种是Sql语句去重,一种是Linq语句去重,其实原理很像,只不过用的方式不太一样而已。
1、单表查询,查询People表中所有不同的年龄
2、查找表中多余的重复记录,重复记录为单个字段(peopleId)
3、对于完全重复的记录的删除
如果表中有些记录完全一样,可以先将查询的记录放在一个临时表中,将原来的表记录删除,最后将临时表的数据导回原来的表中
这些都是在对数据库进行操作的时候进行的去重,如何在向数据库写入之前进行去重操作呢,这就需要Linq语句去重,使得写入数据就是不重复的。
2、Distinct方法去重
假设还是上面的表People,用Distinct方法为:
3、DistinctBy方法去重
4、用GroupBy方法去重
上面这些内容只是简单介绍一下去重方法,各位大牛们有什么好的建议,请大家尽管提。
小编在这里简单介绍两种去重方式,一种是Sql语句去重,一种是Linq语句去重,其实原理很像,只不过用的方式不太一样而已。
Sql语句去重
假设现在有一个表名为People,里面有三个字段,id、name、age。另外一个表名为Department,有三个字段为id、name、peopleId。1、单表查询,查询People表中所有不同的年龄
<span style="font-family:KaiTi_GB2312;font-size:18px;"><span style="font-family:KaiTi_GB2312;font-size:18px;">select distinct age from People</span></span>假如表中的年龄为23、24、23、25、23,用上面的语句查出来的结果就是23、24、25。
2、查找表中多余的重复记录,重复记录为单个字段(peopleId)
<span style="font-family:KaiTi_GB2312;font-size:18px;"><span style="font-family:KaiTi_GB2312;font-size:18px;">select * from Department where peopleId in (select peopleId from people group by peopleId having count(peopleId)>1)</span></span>
3、对于完全重复的记录的删除
如果表中有些记录完全一样,可以先将查询的记录放在一个临时表中,将原来的表记录删除,最后将临时表的数据导回原来的表中
<span style="font-family:KaiTi_GB2312;font-size:18px;"><span style="font-family:KaiTi_GB2312;font-size:18px;">create table 临时表 as (select distinct * from 原来表); delete from 原来表; insert into 原来表(select * from 临时表); delete from 临时表;</span></span>
这些都是在对数据库进行操作的时候进行的去重,如何在向数据库写入之前进行去重操作呢,这就需要Linq语句去重,使得写入数据就是不重复的。
Linq语句去重
1、给Dictionary去重,去重后将不重复的值赋给List<span style="font-family:KaiTi_GB2312;font-size:18px;"><span style="font-family:KaiTi_GB2312;font-size:18px;">Dictionary<string, string> dicStaffSerieas = new Dictionary<string, string>(); //查询dicSerieas得到字典staffSerieas(教师名,系别名) foreach (YzStaffEntity staff in staffList) { if (dictSeries.ContainsKey(staff.SeriesID)) { dicStaffSerieas.Add(staff.StaffName, dictSeries[staff.SeriesID]); //将教师名和教师所在的系别ID放在Dictionary中 } } //去重 List<string> serieasName = new List<string>(); //去重后接收数据的List var v = from arr in dicStaffSerieas.Values //dictionary中保存values的数组 group arr by arr into g select new { g.Key }; foreach (var r in v) { serieasName.Add(r.Key); //将去重后的数据放到List中 }</span></span>
2、Distinct方法去重
假设还是上面的表People,用Distinct方法为:
<span style="font-family:KaiTi_GB2312;font-size:18px;"><span style="font-family:KaiTi_GB2312;font-size:18px;">List<string> nameList = new List<string>; nameList=people.Select(p=>p.name).Distinct().ToList();</span></span>
3、DistinctBy方法去重
<span style="font-family:KaiTi_GB2312;font-size:18px;"><span style="font-family:KaiTi_GB2312;font-size:18px;">var query = people.DistinctBy(p => new { p.Id, p.Name });</span></span>
4、用GroupBy方法去重
<span style="font-family:KaiTi_GB2312;font-size:18px;"><span style="font-family:KaiTi_GB2312;font-size:18px;">List<Person> distinctPeople = allPeople .GroupBy(p => new {p.Id, p.Name} ) .Select(g => g.First()) .ToList(); </span></span>
上面这些内容只是简单介绍一下去重方法,各位大牛们有什么好的建议,请大家尽管提。
总结
数据去重不是一件繁琐的事情,不过也是现在看来。最一开始做项目时,我所做的数据去重是从数据库中查出后,在前面进行去重,将不重复的数据循环放到另一个容器,再从另一个容器进行接下来的操作,这样一下就影响了效率,一旦数据库中数据特别多时,需要做去重的逻辑很复杂时,循环起来就会特别慢,就会特别影响性能。相关文章推荐
- 【Linux驱动】轮询操作select()和poll()
- activity和view判断滑动
- 基础概念之浮点数(二)
- OC-034.block类型(封装代码)
- iOS RDVTabBarController
- C++ <chrono> 时间库
- 排序算法
- UML中的类图
- 获取Exception的详细信息
- APUE-3源码环境搭建 CentOS
- 断点续传 java实现
- 强制提示错误信息
- Shared library "Hello World!" for Android
- web下弹出提示框问题
- @Autowired
- Java实现计算圆周率π的两种方法
- Android编程之SDK安装组件的离线安装方法分享
- case when用法
- 第五章-函数
- 无法还原此客户机 目标主机不支持cpuid错误