首先查询结果顺序一定要与原有记录顺序保持一致,其次不要产生空行
昨天有部分人给了回帖,但是基本上都改变了记录的顺序,有的还产生了空行
请各位大侠帮忙了
问题1:对于以下几个记录
ID
123456
123123
123456
123456
123789所有执行完SQL后的结果顺序与原ID顺序相同,另外由于涉及到数十万条记录的操作,要求速度要快
要求结果1:去除重复ID,显示记录结果为  
123456
123123
123789
要求结果2:去掉重复ID,显示结果为
123123
123789 (与结果1不同的是将所有123456都去除了,而结果1进行了保存)
要求3:根据阈值的不同,决定是否进行重复过滤,例如阈值设置为2,由于123456的重复个数为3,那么由于3》2
结果为
123123
123789  
如果阈值为4,由于3《4
结果为
123456
123123
123456
123456
123789要求结果4:上面提到的过滤均是整个字段的过滤,如果有如下新的需求,只针对字段的前三位进行过滤,上面字段的前三位均是123,那么过滤结果是这6个字符串都是相同的(因为只取前三位作为比较依据),最终输出结果就是这六个字符串,
而如果选择前四位进行过滤,上面字段中有三个是相同的,1234开头的,最终输出结果就是这三个字符串

解决方案 »

  1.   

    create table tb(ID varchar(6))
    insert into tb select '123456'
    insert into tb select '123123'
    insert into tb select '123456'
    insert into tb select '123456'
    insert into tb select '123789'
    go
    set nocount on
    --重构基础临时表
    select identity(int,1,1)as idt,* into # from tb
    select '1.'
    select * from # a where not exists(select 1 from # where id=a.id and idt<a.idt)
    select '2.'
    select * from # a where not exists(select 1 from # where id=a.id and idt<>a.idt)
    select '3.1'
    select * from # a where not exists(select 1 from # where id=a.id group by id having count(*)>2)
    select '3.2'
    select * from # a where not exists(select 1 from # where id=a.id group by id having count(*)>4)
    select '4.1'
    select * from # where left(id,3)='123'
    select '4.2'
    select * from # where left(id,4)='1234'
    go
    drop table tb,#
    /*
    ----
    1.idt         ID
    ----------- ------
    1           123456
    2           123123
    5           123789
    ----
    2.idt         ID
    ----------- ------
    2           123123
    5           123789
    ----
    3.1idt         ID
    ----------- ------
    2           123123
    5           123789
    ----
    3.2idt         ID
    ----------- ------
    1           123456
    2           123123
    3           123456
    4           123456
    5           123789
    ----
    4.1idt         ID
    ----------- ------
    1           123456
    2           123123
    3           123456
    4           123456
    5           123789
    ----
    4.2idt         ID
    ----------- ------
    1           123456
    3           123456
    4           123456*/
      

  2.   

    解释:
    1.
    对于本身就杂乱无章的一列数据,SQL语句只能以原来存储存储以及处理的先后次序从其中检索所需要的数据,并不能严格地以原先排序为序,因为原先实际"无序".
    2.
    如果一定要以原先存储排列为序,那应该另作一表,强制性添加一个序,如上面所加的idt.
    3.
    其实,因原先无序,即使强制生成一序,也是没有意义的,因为,在处理数据时如果谈到顺序,都是要加一个关键字的,如:
    以出生年月为序,以好得多笔划为序,以数量为序,以时间为序等等,楼主在学习SQL的时候,最好先在头脑里形成一个"序"的概念,而不要拘泥于原来的数据排列.
    我是从VFP转过来的,VFP里讲究一个记录顺序,甚至在每行记录前都加一个"行号",可以针对行号来进行很多处理.转到SQL来以后,开始非常不适应,老是想到原来的行排列.很长时间才逐渐适应没有行号的数据记录处理.楼主可不要步我的后尘.
      

  3.   

    同意你的一些观点,继续提个问题
    我手里的输入是一个TXT文档
    结构如下:
    SerNum
    123456
    123789
    123654
    123456
    123456
    123123如何将这个结构生成到excel里(字段类型为文本,不是数值),最后在C++中调用该SQL语句同时,需要一个反向的过程,就是将数据库中排序好的东西重新输入到文本中
      

  4.   

    谢谢,qianjin036a
    之所以有这样的要求,是因为朋友需要的是这样的一个东西
    而他给我的输入就是上面提到的一个txt文档
    同时要求我处理后保持原有顺序
    之前对SQL用的也不多
    所以只好请教各位了
      

  5.   

    在EXCEL里有一个数据导入功能,可以直接将文本文件导入到EXCEL中,在导入过程中可以直接设置导入列的数据类型为文本,你可以试试这个功能.
    如果可以借用或需要使用SQL来对数据进行先行处理,那也可以先将文本数据导入到MSSQL,处理好之后再导出到EXCEL.不过,个人觉得,一般的排序/筛选功能EXCEL里都具备,可以直接在那里处理,而不必麻烦MSSQL了.
      

  6.   

    你说的这个过程需要文本导入
    操作excel
    而用这个东西的人电脑上可能是一个完全不懂office的人
    另外excel的筛查是针对整个字段
    如果想对字段的某些位进行过滤操作
    可能还需要编写VBS脚本,比较麻烦
      

  7.   

    两个建议:
    1. 如果是文本文件里的有序数据,完全可以在录入到DB的时候增加唯一标示字段。
    2. 如果使用者连Office的数据操作功能都不了解,那么他(她)对数据库的倒入/导出以及操作的能力很可能也不高,因此LZ恐怕应该考虑做一个小的程序来自动进行这种整理工作,而不是通过一堆零碎的SQL以及数据DML操作来达到目的。