首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • 有条SQL请教邹大侠 [已结贴,结贴人:ShadowSniper]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • ShadowSniper
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    • 揭帖率:
    发表于:2007-11-09 09:53:19 楼主
                id      aid      ipaddress        time
    ---------------------------------------
                  3016  44151  61.232.12.126    1190599009
                3017  44151  61.232.12.126    1190599009
                3018  44151  61.232.12.126    1190599010
                3019  44151  61.232.12.126    1190599010
                3020  44151  61.232.12.126    1190599010
                3021  44151  61.232.12.126    1190599010
                3022  44151  61.232.12.126    1190599010
                3023  46224  61.133.210.146  1190599011
                3024  45735  218.11.201.203  1190599014
                3025  44729  218.82.108.38    1190599096
                3026  8627    61.181.245.85    1190599098
                3027  46226  123.154.42.135  1190599102
                3028  45111  58.218.152.251  1190599104


    每一组ip相同的数据,time相差86400秒以上的有多少个(这里应该用个聚合函数吧,类似"累减"的操作,第一条减去第二条,如果相差86400,算两条,否则只算作一条,第二条减去第三条...我不知道哪个聚合函数适用),然后再把所有组取出来的值累加起来,用一条sql怎样写?最好是标准SQL,麻烦邹大侠了
    100  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • libin_ftsafe
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    • 5

    发表于:2007-11-09 09:59:211楼 得分:0
    没有这样的聚合函数,而且楼主的数据中似乎没有满足条件的记录。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • dawugui
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    • 3

      3

    发表于:2007-11-09 10:03:202楼 得分:0
    分组排序,两两相减?这个够麻烦的.
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • libin_ftsafe
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    • 5

    发表于:2007-11-09 10:03:573楼 得分:10
    BTW:如果第一条跟第二条时间差小于86400,第二条跟第三条时间差也小于86400,那么算几条?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • dobear_0922
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2007-11-09 10:09:364楼 得分:10
    time相差86400秒?那不就是一天吗?如果只要求日期不同,会简单点
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • ShadowSniper
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2007-11-09 10:12:055楼 得分:0
    嗯,我的数据是从数据库里面随便复制出来的几条,为了说明意图用。所以没有符合条件的记录。

    to:libin_ftsafe

    还是只算一条。这个糟糕的表结构想取这样的结果确实不容易。其实我可以在程序中可以实现的,只是太慢了。所以想试试看能否用一条sql实现
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • ShadowSniper
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2007-11-09 10:13:046楼 得分:0
    to dobear_0922:

    是的,你说得有道理,只要是日期不同就可以。这个思路确实对,有这样的聚合函数嘛?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • dawugui
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    • 3

      3

    发表于:2007-11-09 10:17:207楼 得分:0
    我明白了.看我回复的这个例,和你差不多的要求.

    http://topic.csdn.net/u/20071108/15/29d27ecb-6d45-4582-beff-e73b48357bba.html
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • libin_ftsafe
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    • 5

    发表于:2007-11-09 10:18:118楼 得分:40
    SQL code
    --修改了一条记录以满足时间差的要求,用以测试 set nocount on declare @t table(id int,aid int,ipaddress varchar(15),time int) insert into @t values(3016,44151,'61.232.12.126' ,1190599009) insert into @t values(3017,44151,'61.232.12.126' ,1190599009) insert into @t values(3018,44151,'61.232.12.126' ,1190599010) insert into @t values(3019,44151,'61.232.12.126' ,1190599010) insert into @t values(3020,44151,'61.232.12.126' ,1190599010) insert into @t values(3021,44151,'61.232.12.126' ,1190599010) insert into @t values(3022,44151,'61.232.12.126' ,1191609010) insert into @t values(3023,46224,'61.133.210.146',1190599011) insert into @t values(3024,45735,'218.11.201.203',1190599014) insert into @t values(3025,44729,'218.82.108.38' ,1190599096) insert into @t values(3026,8627 ,'61.181.245.85' ,1190599098) insert into @t values(3027,46226,'123.154.42.135',1190599102) insert into @t values(3028,45111,'58.218.152.251',1190599104) set nocount off select count(distinct aid)+sum(case when time-time1>86400 then 1 else 0 end) as times from (select a.*,b.time as time1 from @t a left join @t b on a.aid=b.aid and a.id=b.id+1) t /* times ----------- 8 */
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • ShadowSniper
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2007-11-09 10:26:019楼 得分:0
    谢谢大乌龟和子陌红尘,只是我用的数据库是mysql,能否用标准SQL写出来呢?不好意思一开始没说清楚,无论如何都要感谢你们。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • dawugui
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    • 3

      3

    发表于:2007-11-09 10:28:4410楼 得分:40
    SQL code
    [code=SQL]create table tb(id int,aid int,ipaddress varchar(20),time int) insert into tb values(3016, 44151, '61.232.12.126' , 1190599009) insert into tb values(3017, 44151, '61.232.12.126' , 1190599009) insert into tb values(3018, 44151, '61.232.12.126' , 1190599010) insert into tb values(3019, 44151, '61.232.12.126' , 1190599010) insert into tb values(3020, 44151, '61.232.12.126' , 1190599010) insert into tb values(3021, 44151, '61.232.12.126' , 1190599010) insert into tb values(3022, 44151, '61.232.12.126' , 1190599010) insert into tb values(3023, 46224, '61.133.210.146', 1190599011) insert into tb values(3024, 45735, '218.11.201.203', 1190599014) insert into tb values(3025, 44729, '218.82.108.38' , 1190599096) insert into tb values(3026, 8627 , '61.181.245.85' , 1190599098) insert into tb values(3027, 46226, '123.154.42.135', 1190599102) insert into tb values(3028, 45111, '58.218.152.251', 1190599104) go select distinct m.ipaddress , isnull(sum(cnt),0) cnt from tb m left join ( select t1.* , cnt = 1 from (select px=(select count(1) from tb where ipaddress=a.ipaddress and id<a.id)+1 , * from tb a) t1, (select px=(select count(1) from tb where ipaddress=a.ipaddress and id<a.id)+1 , * from tb a) t2 where t1.ipaddress = t2.ipaddress and t1.px = t2.px - 1 and t2.time - t1.time > 86400 ) n on m.ipaddress = n.ipaddress group by m.ipaddress drop table tb /* ipaddress cnt -------------------- ----------- 123.154.42.135 0 218.11.201.203 0 218.82.108.38 0 58.218.152.251 0 61.133.210.146 0 61.181.245.85 0 61.232.12.126 0 (所影响的行数为 7 行) */
    [/code]
    修改 删除 举报 引用 回复

    网站简介广告服务网站地图帮助联系方式诚聘英才English 问题报告
    北京创新乐知广告有限公司 版权所有 京 ICP 证 070598 号
    世纪乐知(北京)网络技术有限公司 提供技术支持
    Copyright © 2000-2008, CSDN.NET, All Rights Reserved