免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3275 | 回复: 18
打印 上一主题 下一主题

高手们有空帮小弟看看这个问题。。在线等。。 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-10-11 12:07 |只看该作者 |倒序浏览
非常感谢您关注我这个问题。。今天我想了半天。。也没想到一个好办法。。大家指点一下。
问题如下:

我有一个user表;数据库量在100万条左右(以后可能会增加),表中有一个user_number字段(像这样)
-----user_number----

      1001
      1002
      1003
      1004
      1010
      1000001
      1000002
      1000003
      1000050

我想要统计的结果像这样(我的前台有个start_user_no,     end_user_no,     sum    栏位)

-------start_user_no---        -----end_user_no-----            -----sum-----
              1001                              1004                                   4
              1010                              1010                                   1
              1000001                        1000003                             3
              1000050                        1000050                             1

我想要的就是对于连续的数,,前台只显示起始数号和终止数号像1001到1004...但是遇到不连续的像..1010
我就把它当作一个数..显示在起始和终止栏里面.               sum是统计数据库中的连续号段的记录数。
不知各位大哥有没有听清楚.
有没有好一点的算法..请指教.

非常感谢..在线等...............

论坛徽章:
0
2 [报告]
发表于 2006-10-11 12:57 |只看该作者
md杀脑细胞。。。

SELECT MIN(user_number),MAX(user_number),MAX(user_number)-MIN(user_number)+1
FROM
  (SELECT ROWNUMBER() OVER( ORDER BY user_number) AS rowid
    ,user_number
  FROM user
  )
temp(rowid,user_number)
GROUP BY (user_number-rowid)

[ 本帖最后由 raullew 于 2006-10-11 13:00 编辑 ]

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
3 [报告]
发表于 2006-10-11 12:59 |只看该作者
你贴错版了吧?
用SQL不会,只好用SHELL SCRIPT了。
  1. myaix$cat 1
  2.       1001
  3.       1002
  4.       1003
  5.       1004
  6.       1010
  7.       1000001
  8.       1000002
  9.       1000003
  10.       1000050
  11. myaix$tail +2 1 >2
  12. myaix$paste 1 2 | awk '{if ($2-$1 == 1) printf $1" "; else print $1}' |awk '{print $1, $NF, NF}'
  13. 1001 1004 4
  14. 1010 1010 1
  15. 1000001 1000003 3
  16. 1000050 1000050 1
  17. myaix$
复制代码


脚本写得比较烂,SHELL版的高手应该可以写出更简洁的。

论坛徽章:
0
4 [报告]
发表于 2006-10-11 14:17 |只看该作者
非常感谢楼上的指点..但是小弟对raullew的方法看得比较模糊..爱小弟愚笨raullew能否再讲得清楚一点。

论坛徽章:
0
5 [报告]
发表于 2006-10-11 14:24 |只看该作者

回复 4楼 al8ld 的帖子

ROWNUMBER() OVER( ORDER BY user_number) AS rowid
是针对user_number排序并添加序号作为新的一列,并命名为rowid

形成temp表
1    1001
2      1002
3      1003
4      1004
5      1010
6      1000001
7      1000002
8      1000003
9      1000050

论坛徽章:
0
6 [报告]
发表于 2006-10-11 14:26 |只看该作者
然后按user_number-rowid分组
形成
1000
1005
999995
三个组

取其最小值,最大值。。
就是-------start_user_no---        -----end_user_no-----

论坛徽章:
0
7 [报告]
发表于 2006-10-11 14:28 |只看该作者
当然,默认前提是
这个表本身user_number是unique的

我没有在测试表上验证过。。。你可以试一试。。。

论坛徽章:
0
8 [报告]
发表于 2006-10-11 14:42 |只看该作者
我可能举的这个例子没有代表性。。其实有好多组。。
例如: 101------>120
           1001------>1010
          10001----->10010
          100001----->100010
          1000001---->1000010
如果要分成这几个组。。。但是中间有数据是不连续...差距很大。。例如。。在这个组内1001--->1999
有这些连续和百连续数。
1001
1002
1100
1101
1500
1501
1998
1999
我是想在前台将数据取出来。然后出现这样的效果
-------start_user_no---        -----end_user_no-----            -----sum-----
              1001                              1004                                   4
              1010                              1010                                   1
              1000001                        1000003                             3
              1000050                        1000050                             1

论坛徽章:
0
9 [报告]
发表于 2006-10-11 14:44 |只看该作者
如果你的数据是这样的
1001
1002
1100
1101
1500
1501
1998
1999
从小到大排列,且unique
我认为是对的

论坛徽章:
0
10 [报告]
发表于 2006-10-11 14:51 |只看该作者
但是中间有好多不连续的数。
例如: 1001
           1002
           1010
           1013
           1015
           1080
           1100
            。。。
如果在上百万条中筛选不连续的数。。直接用SQL语句可以吗? 非常感谢你。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP