| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2365 人关注过本帖
标题:在百度遇到的一个问题,麻烦各位看一下用SQL语句能否实现,反正我的水平是不 ...
只看楼主 加入收藏
wjp456789
Rank: 5Rank: 5
来 自:四川成都
等 级:职业侠客
威 望:1
帖 子:345
专家分:330
注 册:2012-6-25
结帖率:90.91%
收藏
已结贴  问题点数:20 回复次数:37 
在百度遇到的一个问题,麻烦各位看一下用SQL语句能否实现,反正我的水平是不行的。
图片附件: 游客没有浏览图片的权限,请 登录注册

问题如图!
搜索更多相关主题的帖子: 百度 
2013-04-03 13:28
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9841
专家分:27213
注 册:2012-2-5
收藏
得分:0 
楼主能告诉我,表中数据的意思吗
该问题的网址?

坚守VFP最后的阵地
2013-04-03 13:36
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9841
专家分:27213
注 册:2012-2-5
收藏
得分:0 
楼主的意思是查询丢失的卡号,对吧
如果是查询丢失的卡号,楼主贴出的最后查询结果应该是不正确的
最后查询的结果应该是
K S
1 3
2 3
2 4


[ 本帖最后由 sdta 于 2013-4-3 13:49 编辑 ]

坚守VFP最后的阵地
2013-04-03 13:41
wjp456789
Rank: 5Rank: 5
来 自:四川成都
等 级:职业侠客
威 望:1
帖 子:345
专家分:330
注 册:2012-6-25
收藏
得分:0 
http://zhidao.baidu.com/question/537715013.html?push=keyword

我是来向高手学习的!
2013-04-03 13:48
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9841
专家分:27213
注 册:2012-2-5
收藏
得分:0 
程序代码:
CLEAR
CREATE CURSOR T (K C(1),S C(1))
CSTR=[1,1;2,1;1,2;2,2;1,4;2,5;3,1;3,2;1,5]
FOR I=1 TO ALINE(AA,CSTR,[;])
    =ALINE(BB,AA(I),[,])
    INSERT INTO T VALUES (BB(1),BB(2))
ENDFOR
SELECT K,CAST(MIN(S) AS N(1)) M1,CAST(MAX(S) AS N(1)) M2,COUNT(S) CN FROM T GROUP BY 1 INTO CURSOR T1
?[查询结果:]
SCAN
   CREATE CURSOR TT (S C(1))
   FOR I=T1.M1 TO T1.M2
       INSERT INTO TT VALUES (TRANSFORM(I))
   ENDFOR
   SELECT TRANSFORM(RECNO([T1])) R,NVL(T.K,[]) K,TT.S S FROM T FULL JOIN TT ON T.S==TT.S AND T.K==TRANSFORM(RECNO([T1])) INTO CURSOR T2
   SELECT T2
   SCAN FOR EMPTY(K)
      ? R,S &&丢失的流水号
   ENDSCAN
   SELECT T1
ENDSCAN
献丑了

坚守VFP最后的阵地
2013-04-03 14:51
kiff
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:广州
等 级:贵宾
威 望:46
帖 子:756
专家分:2531
注 册:2013-1-30
收藏
得分:4 
假设 sycs 为数值型,以下语句只能显示 漏号范围
有点问题,检查一下
----------------------------
本想下可否用SQL ,但还是想不通。觉得还是需要用到循环.
----------------------------
实际工作中,我一直想寻求个好的算法,就是怎么在一个大容量表中求一个最小的 断号.


[ 本帖最后由 kiff 于 2013-4-3 16:31 编辑 ]
2013-04-03 15:14
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9841
专家分:27213
注 册:2012-2-5
收藏
得分:0 
在5楼代码的基础上,优化了一下
程序代码:
CREATE CURSOR TTT (K C(1),S C(1)) &&保存丢失的流水号
CREATE CURSOR T (K C(1),S C(1))
CSTR=[1,1;2,1;1,2;2,2;1,4;2,5;3,1;3,2;1,5]
FOR I=1 TO ALINE(AA,CSTR,[;])
    =ALINE(BB,AA(I),[,])
    INSERT INTO T VALUES (BB(1),BB(2))
ENDFOR

SELECT K,CAST(MIN(S) AS N(1)) M1,CAST(MAX(S) AS N(1)) M2,COUNT(S) CN FROM T GROUP BY 1 INTO CURSOR T1
SCAN
   CREATE CURSOR TT (S C(1))
   FOR I=T1.M1 TO T1.M2
       INSERT INTO TT VALUES (TRANSFORM(I))
   ENDFOR
   SELECT TRANSFORM(RECNO([T1])) R,NVL(T.K,[]) K,TT.S S FROM T FULL JOIN TT ON T.S==TT.S AND T.K==TRANSFORM(RECNO([T1])) INTO CURSOR T2
   INSERT INTO TTT SELECT R,S FROM T2 WHERE EMPTY(K)
   SELECT T1
ENDSCAN
SELECT TTT
BROWSE


坚守VFP最后的阵地
2013-04-03 15:59
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9841
专家分:27213
注 册:2012-2-5
收藏
得分:0 
以下是引用kiff在2013-4-3 15:14:00的发言:

假设 sycs 为数值型,以下语句只能显示 漏号范围
有点问题,检查一下
----------------------------
本想下可否用SQL ,但还是想不通。觉得还是需要用到循环.
----------------------------
实际工作中,我一直想寻求个好的算法,就是怎么在一个大容量表中求一个最小的 断号.
SELECT K,CAST(MIN(S) AS N(1)) M1,CAST(MAX(S) AS N(1)) M2,COUNT(S) CN FROM T GROUP BY 1 INTO CURSOR T1
红字处,可能对你有帮助。
划分记录范围,逐段查询。
SQL命令也不是万能的。
用CN-M2来判断是否断号

[ 本帖最后由 sdta 于 2013-4-3 16:50 编辑 ]

坚守VFP最后的阵地
2013-04-03 16:48
kiff
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:广州
等 级:贵宾
威 望:46
帖 子:756
专家分:2531
注 册:2013-1-30
收藏
得分:0 
用我以前 求最小的断号的方法。再结合递归算法。
CLOSE DATABASES
USE every IN 0

如果sycs 为字符型,就用这句
SELECT kahao,int(val(sycs)) sycs FROM every INTO CURSOR every_tmp1 READWRITE  && 为不影响原表数据,复制一份,用于查找丢失的流水号.

*如果sycs 为数值型,就用这句代替上一句
*SELECT kahao,sycs FROM every INTO CURSOR every_tmp1 READWRITE

SELECT * FROM every_tmp1  INTO CURSOR every_tmp2 READWRITE WHERE .f. &&用于保存丢失的流水号记录
USE IN every
=get_min_id() &&查找最小一个丢失的流水号
SELECT * FROM every_tmp2 INTO CURSOR every_tmp ORDER BY kahao,sycs  &&将查询结果排序一下
SELECT every_tmp  &&丢失的流水号
BROWSE
CLOSE DATABASES
RETURN
FUNCTION get_min_id()
    SELECT a.*,RECNO() _id1,RECNO() _id2 FROM (select * FROM every_tmp1 ORDER BY kahao,sycs) a INTO CURSOR every_tmp3  READWRITE
    UPDATE every_tmp3 SET _id1=every_tmp3._id2-b._id2+1 from (select kahao,MIN(_id2) _id2 from every_tmp3 group by kahao) b WHERE every_tmp3.kahao==b.kahao
    SELECT kahao,MIN(_id1) _id1 FROM every_tmp3 WHERE sycs<>_id1 INTO CURSOR  every_tmp4 GROUP BY kahao  &&取最小丢失的流水号
    USE IN every_tmp3
    IF RECCOUNT('every_tmp4')>0
        INSERT INTO every_tmp2 (kahao,sycs) SELECT kahao,_id1 FROM every_tmp4
        INSERT INTO every_tmp1 (kahao,sycs) SELECT kahao,_id1 FROM every_tmp4
        USE IN every_tmp4
        =get_min_id()  &&查找最小一个丢失的流水号,递归查找, 直到再没丢失的流水号为止.
    ENDIF
    IF USED('every_tmp4')
        USE IN every_tmp4
    ENDIF
    RETURN
ENDFUNC

测试表

every.rar (511 Bytes)



[ 本帖最后由 kiff 于 2013-4-5 14:42 编辑 ]
2013-04-04 08:22
taifu945
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:80
帖 子:1545
专家分:3298
注 册:2012-7-6
收藏
得分:0 
经研究,可以用一条SELECT-SQL命令得出结果。如果你的流水号和卡号都是自然数的话,可以试试下面的命令(我用的数据就是你在顶楼贴出来的):
SELECT * ;
   FROM ;
      (SELECT DISTINCT Kahao_a Kahao, STR(VAL(Sycs_b)-VAL(Sycs_a),1) Sycs ;
          FROM ;
            (SELECT * ;
                FROM T1 ;
                   JOIN T1 T1_a ;
                      ON T1.kahao=T1_a.Kahao AND T1.Sycs<T1_a.Sycs) T2) T3 ;
   WHERE T3.Kahao+T3.Sycs NOT IN ;
      (SELECT Kahao+Sycs FROM T1) ;
   ORDER BY Kahao, Sycs

这条命令的思路是:先把表文件在Sycs字段上进行错位自联接(这一步很关键),然后通过减差并在原表中比较的方法得出不存在的流水号。
当然,也可以用程序段的方法实现。思路是:先把表进行索引,然后在同一Kahao值下对Sycs进行查缺(上下记录比较),相邻两条记录的Sycs值相差2或以上,就有缺漏。具体代码就不写了。

图片附件: 游客没有浏览图片的权限,请 登录注册



[ 本帖最后由 taifu945 于 2013-4-5 10:02 编辑 ]
2013-04-05 09:56
快速回复:在百度遇到的一个问题,麻烦各位看一下用SQL语句能否实现,反正我的水 ...
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.087167 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved