首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • 请教一个SQL语句:查询相近记录的。
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • cqa
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    • 揭帖率:
    发表于:2008-05-19 14:41:16 楼主
    一个表:
    用户ID、金额、时间。
    要找到所有
        用户ID、金额相同,时间相差一分钟的记录
    的SQL语句怎么写?
    100  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • dawugui
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    • 3

      3

    发表于:2008-05-19 15:14:101楼 得分:0
    引用楼主 cqa 的帖子:
    一个表:
    用户ID、金额、时间。
    要找到所有 
        用户ID、金额相同,时间相差一分钟的记录
    的SQL语句怎么写?


    SQL code
    select m.* , n.* from ( select * , (select count(1) from tb where 用户ID = t.用户ID and 金额 = t.金额 and 时间 < t.时间) + 1 px from tb t ) m, ( select * , (select count(1) from tb where 用户ID = t.用户ID and 金额 = t.金额 and 时间 < t.时间) + 1 px from tb t ) n where m.用户ID = n.用户ID and m.金额 = n.金额 and m.px = n.px - 1 and (n.时间 - m.时间) * 24 * 60 * 60 <= 60
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • feifeiloveIT
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-05-19 15:18:412楼 得分:0
    select m.* , n.* from
    (
      select * , (select count(1) from tb where 用户ID = t.用户ID and 金额 = t.金额 and 时间 < t.时间) + 1 px from tb t
    ) m,
    (
      select * , (select count(1) from tb where 用户ID = t.用户ID and 金额 = t.金额 and 时间 < t.时间) + 1 px from tb t
    ) n
    where m.用户ID = n.用户ID and m.金额 = n.金额 and m.px = n.px - 1 and (n.时间 - m.时间) * 24 * 60 * 60 <= 60


    恩,可以
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • doer_ljy
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-05-21 17:54:403楼 得分:0
    m.px = n.px - 1 ...
    不等于的时候就没有时差在一分钟以内的记录了吗?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • hebo2005
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    • 3

      2

    发表于:2008-05-21 18:09:354楼 得分:0
    两条纪录相差一分钟,是要显示两条纪录,还是显示后一条?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • hebo2005
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    • 3

      2

    发表于:2008-05-21 18:15:205楼 得分:0
    还有,这个相差是指正好是1分钟内,还是=1分钟?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • hebo2005
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    • 3

      2

    发表于:2008-05-21 18:23:226楼 得分:0
    WITH a AS
        (SELECT 1 user_id, 100 amt,
                TO_DATE ('20080520010101', 'yyyymmddhh24miss') times
            FROM DUAL
          UNION ALL
          SELECT 1 user_id, 100 amt,
                TO_DATE ('20080520010141', 'yyyymmddhh24miss')
            FROM DUAL
          UNION ALL
          SELECT 1 user_id, 100 amt,
                TO_DATE ('20080520010301', 'yyyymmddhh24miss')
            FROM DUAL
          UNION ALL
          SELECT 1 user_id, 100 amt,
                TO_DATE ('20080520010401', 'yyyymmddhh24miss')
            FROM DUAL
          UNION ALL
          SELECT 1 user_id, 100 amt,
                TO_DATE ('20080520010501', 'yyyymmddhh24miss')
            FROM DUAL
          UNION ALL
          SELECT 1 user_id, 100 amt,
                TO_DATE ('20080520010601', 'yyyymmddhh24miss')
            FROM DUAL
          UNION ALL
          SELECT 1 user_id, 100 amt,
                TO_DATE ('20080520010801', 'yyyymmddhh24miss')
            FROM DUAL
          UNION ALL
          SELECT 2 user_id, 100 amt,
                TO_DATE ('20080520010101', 'yyyymmddhh24miss')
            FROM DUAL
          UNION ALL
          SELECT 2 user_id, 100 amt,
                TO_DATE ('20080520010141', 'yyyymmddhh24miss')
            FROM DUAL
          UNION ALL
          SELECT 3 user_id, 100 amt,
                TO_DATE ('20080520010301', 'yyyymmddhh24miss')
            FROM DUAL
          UNION ALL
          SELECT 3 user_id, 100 amt,
                TO_DATE ('20080520010401', 'yyyymmddhh24miss')
            FROM DUAL
          UNION ALL
          SELECT 4 user_id, 100 amt,
                TO_DATE ('20080520010501', 'yyyymmddhh24miss')
            FROM DUAL
          UNION ALL
          SELECT 4 user_id, 100 amt,
                TO_DATE ('20080520010601', 'yyyymmddhh24miss')
            FROM DUAL
          UNION ALL
          SELECT 4 user_id, 100 amt,
                TO_DATE ('20080520010801', 'yyyymmddhh24miss')
            FROM DUAL)
    插入测试数据
    Row# USER_ID AMT TIMES

    1 1 100 2008/5/20 1:01:01
    2 1 100 2008/5/20 1:01:41
    3 1 100 2008/5/20 1:03:01
    4 1 100 2008/5/20 1:04:01
    5 1 100 2008/5/20 1:05:01
    6 1 100 2008/5/20 1:06:01
    7 1 100 2008/5/20 1:08:01
    8 2 100 2008/5/20 1:01:01
    9 2 100 2008/5/20 1:01:41
    10 3 100 2008/5/20 1:03:01
    11 3 100 2008/5/20 1:04:01
    12 4 100 2008/5/20 1:05:01
    13 4 100 2008/5/20 1:06:01
    14 4 100 2008/5/20 1:08:01


    SQL code
    SELECT user_id, amt, times FROM (SELECT user_id, amt, times, LAG (times, 1, times - 1) OVER (PARTITION BY user_id, amt ORDER BY times) pre_times, LEAD (times, 1, SYSDATE + 1) OVER (PARTITION BY user_id, amt ORDER BY times) after_times FROM a) WHERE (times - pre_times) * 1440 <= 1 OR (after_times - times) * 1440 <= 1



    结果
    Row# USER_ID AMT TIMES

    1 1 100 2008/5/20 1:01:01
    2 1 100 2008/5/20 1:01:41
    3 1 100 2008/5/20 1:03:01
    4 1 100 2008/5/20 1:04:01
    5 1 100 2008/5/20 1:05:01
    6 1 100 2008/5/20 1:06:01
    7 2 100 2008/5/20 1:01:01
    8 2 100 2008/5/20 1:01:41
    9 3 100 2008/5/20 1:03:01
    10 3 100 2008/5/20 1:04:01
    11 4 100 2008/5/20 1:05:01
    12 4 100 2008/5/20 1:06:01
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • hebo2005
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    • 3

      2

    发表于:2008-05-21 18:24:467楼 得分:0
    这个语句是把只要相邻时间在一分钟内的纪录全取出来
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • wj6625
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-05-22 17:56:098楼 得分:0
    学习中~
    修改 删除 举报 引用 回复

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