prophetceo prophetceo
关注数: 24 粉丝数: 32 发帖数: 6,448 关注贴吧数: 19
SQL有条件地筛选重复数据 SQL 有条件地筛选重复数据 . --基础了解: 1) select distinct name from table --打开重复记录的单个字段 2) select * from table where fid in(Select min(fid) FROM table group by name)--打开重复记录的所有字段值 3) select * from table where name in(select name from table group by name having count(name)=1)--打开重复任意次数的所有记录 --筛选重复数据就用上面的第二条语句,但是如果我要进行有条件地查询,还需要一点点转换,下面是一个例子: --testact表创建如下: CREATE TABLE testact ( tid int IDENTITY(1,1) PRIMARY KEY NOT NULL,--自增ID TDate datetime DEFAULT getdate() NOT NULL,--发表时间 TUrl varchar(255) DEFAULT '' NOT NULL,--新闻链接地址 TTop smallint DEFAULT 0 NOT NULL --是否置顶 ) --基本数据 INSERT INTO testact(TDate,TUrl,TTop) VALUES(getdate(),'http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Fwww.baidu.com&urlrefer=d04a537000146ae20785a6d0d3533551',1) INSERT INTO testact(TDate,TUrl,TTop) VALUES(dateadd(dd,1,getdate()), 'http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Fwww.baidu.com&urlrefer=d04a537000146ae20785a6d0d3533551',0) INSERT INTO testact(TDate,TUrl,TTop) VALUES(getdate(),'http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Fwww.google.com&urlrefer=e0fdc4d10bdac6fdf6743616b9d0ffeb',0) INSERT INTO testact(TDate,TUrl,TTop) VALUES(dateadd(dd,1,getdate()),'http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Fwww.google.com&urlrefer=e0fdc4d10bdac6fdf6743616b9d0ffeb',0) INSERT INTO testact(TDate,TUrl,TTop) VALUES(getdate(),'http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Fwww.baidu.com%3Fa%3D1&urlrefer=91ffa178702cff1e64e26a8fe69cc623',1) INSERT INTO testact(TDate,TUrl,TTop) VALUES(dateadd(dd,1,getdate()),'http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Fwww.baidu.com%3Fa%3D1&urlrefer=91ffa178702cff1e64e26a8fe69cc623',1) INSERT INTO testact(TDate,TUrl,TTop) VALUES(dateadd(dd,2,getdate()),'http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Fwww.baidu.com%3Fa%3D1&urlrefer=91ffa178702cff1e64e26a8fe69cc623',0) INSERT INTO testact(TDate,TUrl,TTop) VALUES(getdate(),'http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Fwww.baidu.com%3Fb%3D1&urlrefer=fe4df1d597e9bae35792035a7ec3b995',1) INSERT INTO testact(TDate,TUrl,TTop) VALUES(dateadd(dd,2,getdate()),'http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Fwww.baidu.com%3Fb%3D1&urlrefer=fe4df1d597e9bae35792035a7ec3b995',1) INSERT INTO testact(TDate,TUrl,TTop) VALUES(getdate(),'http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Fwww.baidu.com%3Fc%3D1&urlrefer=0252eec526cc91257a74d2ef18f99f44',0) /* 要求:比如说有一个新闻表testact,有字段:tid(自增ID),TDate(发表时间),TUrl(链接地址),TTop(是否置顶)。 表里数据TUrl(链接地址)可能会重复。 1)如果 TUrl(链接地址)重复,有一个置顶,一个不置顶的,则取置顶的数据(不管时间先后)。 2)如果 TUrl(链接地址)重复,都置顶的或都不置顶的,则取 发表时间(TDate)最新的数据。 3)如果 TUrl(链接地址)没有重复的,则直接取出。 4)最后对置顶和时间进行倒序排序 */ 这个问题我一开始看的时间感觉还真有点复杂,但后来考虑到用一个表进行转换,倒也方便,容易不难理解 --分析下面两个语句 [1]:SELECT * FROM testact ORDER BY turl, ttop DESC, tdate DESC --得出的排序的结果,分析结果不就是每一个重复TUrl的第一条记录吗 [2] select * from table where fid in(Select min(fid) FROM table group by name)--打开重复记录的所有字段值 --建立一个转换表(其实就是为了给[1]的结果增加一个自增ID, 再用[2]取ID最小的数据 CREATE TABLE testtmp ( tmpid int IDENTITY(1,1) PRIMARY KEY NOT NULL, tid int DEFAULT 0 NOT NULL, TUrl varchar(255) DEFAULT '' NOT NULL ) --向testtmp插入testact的两列数据 INSERT INTO testtmp(tid,turl) SELECT tid,turl FROM testact ORDER BY turl, ttop DESC, tdate DESC --最后结果 SELECT * FROM testact WHERE tid IN( SELECT tid FROM testtmp t WHERE tmpid IN(SELECT min(t.tmpid) FROM testtmp t GROUP BY t.TUrl)) ORDER BY TTop DESC , TDate DESC --换一下条件, 1)如果新闻表TUrl有重复的,但日期有已过期的,也有还没过期的,则取还没过期的且离当前日期最近的记录 2)如果新闻表TUrl有重复的,但日期都已过期的,则取离当前日期最近的已过期记录 3)如果新闻表TUrl有重复的,但日期都未过期的,则取离当前日期最近的未过期记录 4)如果 TUrl(链接地址)重复,有一个置顶,一个不置顶的,则取置顶的数据(不管时间先后)。 5)最后对置顶和时间进行倒序排序 总之,对于重复的数据,有置顶的就显示置顶的,有还没过期的先显示还没过期的再到已过期的(但要显示离现在最近的日期) DROP TABLE testtmp CREATE TABLE testtmp ( tmpid int IDENTITY(1,1) PRIMARY KEY NOT NULL, tid int DEFAULT 0 NOT NULL, TUrl varchar(255) DEFAULT '' NOT NULL, tdate datetime DEFAULT getdate() NOT NULL, --时间 tdate1 datetime, tdate2 datetime ) INSERT INTO testtmp(tid,turl,tdate,tdate1, tdate2) SELECT tid,turl,tdate, CASE WHEN datediff(dd, getdate(), tdate) >= 0 THEN tdate ELSE '2030-01-01' END AS date1 , CASE WHEN datediff(dd, getdate(), tdate) < 0 THEN tdate ELSE '2000-01-01' END AS date2 FROM testact ORDER BY turl, ttop DESC, date1, date2 DESC SELECT * FROM testact WHERE tid IN( SELECT tid FROM testtmp t WHERE tmpid IN(SELECT min(t.tmpid) FROM testtmp t GROUP BY t.TUrl)) ORDER BY ttop DESC, tdate DESC 另外,在网上看到的例子: 表格式如下: ID S_ID COURSE_NAME STATE 1 1900560013 课程A 0 2 1900560013 课程A 1 3 1900930116 课程A 0 4 1900930116 课程A 1 5 1900930116 课程B 1 6 1900930116 课程C 0 7 1900930116 课程B 0 8 1900930116 课程C 1 现在 S_ID,COURSE_NAME 两个字段有重复,需要删除重复,但是两条重复的数据需检查STATE,需要删除的是STATE=1的,如果两天重复的数据STATE都等于1,则任意删除一条。 create table #t ( ID INT NOT NULL IDENTITY(1,1) PRIMARY KEY, S_ID VARCHAR(50) NOT NULL, COURSE_NAME VARCHAR(20) NOT NULL, STATE BIT NOT NULL ) insert into #t(S_ID, COURSE_NAME, STATE) SELECT '1900560013','A',0 UNION SELECT '1900560013','A',1 UNION SELECT '1900930116','A',1 UNION SELECT '1900930116','A',1 UNION SELECT '1900930116','A',1 UNION SELECT '1900930116','B',1 UNION SELECT '1900930116','C',0 UNION SELECT '1900930116','B',0 UNION SELECT '1900930116','C',1 UNION SELECT '1900930117','D',1 UNION SELECT '1900930117','D',1 select * from #t delete from #t where ID not in ( select min(id) from #t group by S_ID,COURSE_NAME,[STATE] ) select * from #t --这个地方就按照你的要求删除S_ID,COURSE_NAME一样,但[STATE]=1的数据 delete from #t where ID in ( select t.ID from #t t inner join ( select S_ID,COURSE_NAME from #t group by S_ID,COURSE_NAME having COUNT(*)>1 ) as tt on t.s_id=tt.s_id and t.course_name=tt.course_name where t.state=1 ) select * from #t DROP TABLE #t 总结一下:就是先删除S_ID COURSE_NAME STATE都有重复的数据,然后再删除 group by S_ID,COURSE_NAME 超过两条记录, 且 state=1 的记录
table排序 今天由于业务需要,要在客户端对一个报表进行排序,所以就想到了jquery插件,下面简单介绍一下配置步骤,备忘: 1、下载jquery-latest.js和jquery.tablesorter.js包,如果想让报表更美观,也可以下载官方推荐的几款布局文件。 2、将1下载的包放到报表页面项目某一目录下,我是在页面当前目录下新建了一个js目录,将jquery-latest.js和jquery.tablesorter.js放到里面,另外新建了一个自己的custom.js用来写客户端代码,同时我也建了一个css目录用来为报表页面更换皮肤,里面放了blue、green等不同的皮肤。 3、报表页面引入资源文件 <script type="text/javascript" src="js/jquery-latest.js"></script> <script type="text/javascript" src="js/jquery.tablesorter.js"></script> <script type="text/javascript" src="js/custom.js"></script> <link rel="stylesheet" type="text/css" href="css/blue/style.css"> 4、表格加上class="tablesorter",另外比较重要的就是要加上thead和tbody标签,thead标签里的tr标签要加上class="header"才能控制显示皮肤图片,切忌。 5、在custom.js中编写对报表的基本要求,比如每一列按照什么数据类型排序,哪几列初始化时升序或者降序排列等等,注意列的索引是从0开始的,简单贴一点代码以明义: $(document).ready(function(){ $("#mytable").tablesorter({ //mytable是报表table的id 1: {sorter:"integer"}, //表格的第二列按照integer数据类型进行排序 2: {sorter:"integer"}, 3: {sorter:"double"}, sortList: [[1,1],[2,0],[3,1]] //初始化表格时第二列按照降序排序,第三列按照升序排列,第四列按照降序排列 }); } );
访问修饰符 访问修饰符用于限制类、结果以及它们的成员的可访问性,包括以下五个可访问性级别: 1)public:最高访问级别。同一程序集的其他任何代码或引用该程序集的其他程序集都可以访问该类型或成员。 2)protected:保护级别。同一类和派生(继承特性)类中的代码可以访问该类型和成员。 3)internal:内部访问级别。同一程序集中的任何代码都可以访问该类型或成员,但其他程序集不可以访问。 4)protected internal:内部保护级别。访问仅限于当前程序集,也可由自身及派生类访问。 5)private : 私有访问,最低访问级别。同一类和结构(不包括派生类)的代码可以访问该类型和成员。   以上访问级别逐渐减低。   以下是各类型中的成员的默认访问修饰符: MSDN提示:   1)派生类的可访问性不能高于其基类型。换句话说,不能有从内部类A派生的公共类B。   2)成员的可访问性决不能高于其包含类型的可访问性。   3)可以使用五种访问类型中的任何一种来声明类成员(包括嵌套的类和结构)。 接口(interface)   接口本身的默认访问修饰符为internal,可以另外再显式使用访问修饰符。   接口成员访问修饰符默认为public,且不能显式使用访问修饰符。 类(class)   类本身默认访问修饰符为Internal。   构造函数默认为public访问修饰符。   析构函数不能显示使用访问修饰符且默认为private访问修饰符。   类的成员默认访问修饰符为private,可以显式使用访问修饰符,但访问级别必须小于类本身。另外,静态类的成员不能使用protected或者protected internal修饰。 枚举(enum)   枚举类型成员默认为public访问修饰符,且不能显式使用访问修饰符。 结构(struct)   结构成员默认为private修饰符。   结构成员无法声明为protected成员,因为结构不支持继承。 嵌套类型   嵌套类型的默认访问修饰符为private。 和类,结构的成员默认访问类型一致。
1 下一页