12
返回列表 发新帖
楼主: KEN6503

[SQL] 如何找出有不连续seq的记录

[复制链接]
论坛徽章:
18
优秀写手
日期:2014-02-27 06:00:13秀才
日期:2017-12-12 09:52:44秀才
日期:2017-08-11 15:37:32弗兰奇
日期:2017-07-04 09:16:01秀才
日期:2017-06-29 10:16:48乌索普
日期:2017-05-26 08:58:24娜美
日期:2017-05-18 16:07:23ITPUB15周年纪念
日期:2017-05-02 15:22:36妮可·罗宾
日期:2017-04-06 10:06:19处女座
日期:2016-03-10 09:03:26
11#
发表于 2017-3-20 15:53 | 只看该作者
KEN6503 发表于 2017-3-18 06:42
用4楼的思路,稍改动一下就可以了。
WITH T AS (
SELECT 100 AS ID, 1 AS SEQ FROM DUAL

其实就用你自己的SQL套一层就行;
WITH T AS (
SELECT 100 AS ID, 1 AS SEQ FROM DUAL
UNION ALL
SELECT 100 AS ID, 2 AS SEQ FROM DUAL
UNION ALL
SELECT 100 AS ID, 3 AS SEQ FROM DUAL
UNION ALL
SELECT 200 AS ID, 1 AS SEQ FROM DUAL
UNION ALL
SELECT 200 AS ID, 2 AS SEQ FROM DUAL
UNION ALL
SELECT 200 AS ID, 4 AS SEQ FROM DUAL
UNION ALL
SELECT 300 AS ID, 1 AS SEQ FROM DUAL
UNION ALL
SELECT 300 AS ID, 2 AS SEQ FROM DUAL
UNION ALL
SELECT 300 AS ID, 2 AS SEQ FROM DUAL
UNION ALL
SELECT 300 AS ID, 4 AS SEQ FROM DUAL)
SELECT *
FROM   (SELECT T1.*,
                MAX(CASE
                       WHEN SEQ = LAG_1 OR
                            LAG_1 + 1 != SEQ THEN
                        1
                       ELSE
                        0
                     END) OVER(PARTITION BY ID) RN
         FROM   (SELECT ID, SEQ,
                         LAG(SEQ) OVER(PARTITION BY ID ORDER BY SEQ) LAG_1
                  FROM   T) T1)
WHERE  RN = 1

使用道具 举报

回复
招聘 : 数据库开发
论坛徽章:
29
秀才
日期:2015-12-14 14:47:54秀才
日期:2015-11-12 17:43:40秀才
日期:2015-11-11 10:22:49秀才
日期:2015-11-11 09:58:34秀才
日期:2015-10-26 09:24:12秀才
日期:2015-09-21 11:16:42秀才
日期:2015-12-14 14:51:16秀才
日期:2015-12-14 14:56:09秀才
日期:2015-11-23 09:48:22ITPUB14周年纪念章
日期:2015-10-26 17:23:44
12#
发表于 2017-3-20 15:57 | 只看该作者
lastwinner 发表于 2017-3-20 11:39
谢谢推荐,原文在此 http://www.itpub.net/thread-719692-1-1.html

那个时候都是那么的青涩呀

使用道具 举报

回复
论坛徽章:
126
ITPUB元老
日期:2007-07-04 17:27:50会员2007贡献徽章
日期:2007-09-26 18:42:10现任管理团队成员
日期:2011-05-07 01:45:08优秀写手
日期:2015-01-09 06:00:14版主7段
日期:2015-07-16 02:10:00
13#
发表于 2017-3-20 18:02 | 只看该作者


方法很多

SQL> WITH T AS (
  2  SELECT 100 AS ID, 1 AS SEQ FROM DUAL
  3  UNION ALL
  4  SELECT 100 AS ID, 2 AS SEQ FROM DUAL
  5  UNION ALL
  6  SELECT 100 AS ID, 3 AS SEQ FROM DUAL
  7  UNION ALL
  8  SELECT 200 AS ID, 1 AS SEQ FROM DUAL
  9  UNION ALL
10  SELECT 200 AS ID, 2 AS SEQ FROM DUAL
11  UNION ALL
12  SELECT 200 AS ID, 4 AS SEQ FROM DUAL
13  UNION ALL
14  SELECT 300 AS ID, 1 AS SEQ FROM DUAL
15  UNION ALL
16  SELECT 300 AS ID, 2 AS SEQ FROM DUAL
17  UNION ALL
18  SELECT 300 AS ID, 1 AS SEQ FROM DUAL)
19  select  id,
20          seq
21  from
22  (select id,
23          seq,
24          sum(diff) over(partition by id) diff
25  from
26  (select id,
27          seq,
28          seq - row_number() over(partition by id order by seq) diff
29     from t))
30  where diff <> 0;

        ID        SEQ
---------- ----------
       200          1
       200          2
       200          4
       300          1
       300          1
       300          2

6 rows selected

SQL>




使用道具 举报

回复
论坛徽章:
484
ITPUB北京香山2007年会纪念徽章
日期:2007-01-24 14:35:02ITPUB北京九华山庄2008年会纪念徽章
日期:2008-01-21 16:50:24ITPUB北京2009年会纪念徽章
日期:2009-02-09 11:42:452010新春纪念徽章
日期:2010-03-01 11:04:552010数据库技术大会纪念徽章
日期:2010-05-13 10:04:272010系统架构师大会纪念
日期:2010-09-04 13:35:54ITPUB9周年纪念徽章
日期:2010-10-08 09:28:512011新春纪念徽章
日期:2011-02-18 11:43:32ITPUB十周年纪念徽章
日期:2011-11-01 16:19:412012新春纪念徽章
日期:2012-01-04 11:49:54
14#
发表于 2017-3-21 00:23 | 只看该作者
juan025 发表于 2017-3-20 15:57
那个时候都是那么的青涩呀

咋看出来的青涩?

话说一晃十年过去了

使用道具 举报

回复
论坛徽章:
13
2010新春纪念徽章
日期:2010-03-01 11:04:59技术图书徽章
日期:2018-03-01 10:21:49秀才
日期:2018-03-01 10:21:252015年新春福章
日期:2015-03-06 11:58:18喜羊羊
日期:2015-03-04 14:52:46优秀写手
日期:2014-04-22 06:00:18马上有对象
日期:2014-02-18 16:44:082014年新春福章
日期:2014-02-18 16:44:082013年新春福章
日期:2013-02-25 14:51:242012新春纪念徽章
日期:2012-01-04 11:56:01
15#
 楼主| 发表于 2017-3-21 09:25 | 只看该作者
fage090 发表于 2017-3-20 10:33
这个逻辑有点问题吧? 假如有4行,seq分别是1、2、2、4 。这样不连续又有重复的,就筛选不出来了

确实是。
Itpub搞手真多。谢谢

使用道具 举报

回复
论坛徽章:
18
优秀写手
日期:2014-02-27 06:00:13秀才
日期:2017-12-12 09:52:44秀才
日期:2017-08-11 15:37:32弗兰奇
日期:2017-07-04 09:16:01秀才
日期:2017-06-29 10:16:48乌索普
日期:2017-05-26 08:58:24娜美
日期:2017-05-18 16:07:23ITPUB15周年纪念
日期:2017-05-02 15:22:36妮可·罗宾
日期:2017-04-06 10:06:19处女座
日期:2016-03-10 09:03:26
16#
发表于 2017-3-21 09:35 | 只看该作者
bell6248 发表于 2017-3-20 18:02
方法很多

SQL> WITH T AS (

这个不保险, 可能正负相抵;
可以改成 max(nullif(diff,0)) 来取出含非零的ID;
WITH T AS (
  SELECT 300 AS ID, 1 AS SEQ FROM DUAL
  UNION ALL
SELECT 300 AS ID, 2 AS SEQ FROM DUAL
UNION ALL
  SELECT 300 AS ID, 2 AS SEQ FROM DUAL
  UNION ALL
SELECT 300 AS ID, 5 AS SEQ FROM DUAL
UNION ALL
  SELECT 300 AS ID, 5 AS SEQ FROM DUAL)
  select  id,
          seq
  from
  (select id,
         seq,
          sum(diff) over(partition by id) diff
from
  (select id,
          seq,
          seq - row_number() over(partition by id order by seq) diff
     from t))
where diff <> 0;

  select  id,
          seq
  from
  (select id,
         seq,
          max(nullif(diff,0)) over(partition by id) diff
from
  (select id,
          seq,
          seq - row_number() over(partition by id order by seq) diff
     from t))
where diff <> 0;

使用道具 举报

回复
论坛徽章:
126
ITPUB元老
日期:2007-07-04 17:27:50会员2007贡献徽章
日期:2007-09-26 18:42:10现任管理团队成员
日期:2011-05-07 01:45:08优秀写手
日期:2015-01-09 06:00:14版主7段
日期:2015-07-16 02:10:00
17#
发表于 2017-3-21 09:46 | 只看该作者
chengccy2010 发表于 2017-3-21 09:35
这个不保险, 可能正负相抵;
可以改成 max(nullif(diff,0)) 来取出含非零的ID;
WITH T AS (

哪里不保险, 你能用数据举例吗?

使用道具 举报

回复
论坛徽章:
18
优秀写手
日期:2014-02-27 06:00:13秀才
日期:2017-12-12 09:52:44秀才
日期:2017-08-11 15:37:32弗兰奇
日期:2017-07-04 09:16:01秀才
日期:2017-06-29 10:16:48乌索普
日期:2017-05-26 08:58:24娜美
日期:2017-05-18 16:07:23ITPUB15周年纪念
日期:2017-05-02 15:22:36妮可·罗宾
日期:2017-04-06 10:06:19处女座
日期:2016-03-10 09:03:26
18#
发表于 2017-3-21 09:49 | 只看该作者
bell6248 发表于 2017-3-21 09:46
哪里不保险, 你能用数据举例吗?

我楼上回复的SQL就是例子

使用道具 举报

回复
论坛徽章:
126
ITPUB元老
日期:2007-07-04 17:27:50会员2007贡献徽章
日期:2007-09-26 18:42:10现任管理团队成员
日期:2011-05-07 01:45:08优秀写手
日期:2015-01-09 06:00:14版主7段
日期:2015-07-16 02:10:00
19#
发表于 2017-3-21 10:55 | 只看该作者
chengccy2010 发表于 2017-3-21 09:49
我楼上回复的SQL就是例子



其实小改改即可, 代码如下

SQL> WITH T AS (
  2  SELECT 100 AS ID, 1 AS SEQ FROM DUAL
  3  UNION ALL
  4  SELECT 100 AS ID, 2 AS SEQ FROM DUAL
  5  UNION ALL
  6  SELECT 100 AS ID, 3 AS SEQ FROM DUAL
  7  UNION ALL
  8  SELECT 200 AS ID, 1 AS SEQ FROM DUAL
  9  UNION ALL
10  SELECT 200 AS ID, 2 AS SEQ FROM DUAL
11  UNION ALL
12  SELECT 200 AS ID, 4 AS SEQ FROM DUAL
13  UNION ALL
14  SELECT 300 AS ID, 1 AS SEQ FROM DUAL
15  UNION ALL
16  SELECT 300 AS ID, 2 AS SEQ FROM DUAL
17  UNION ALL
18  SELECT 300 AS ID, 1 AS SEQ FROM DUAL
19  union all
20  SELECT 800 AS ID, 1 AS SEQ FROM DUAL
21    UNION ALL
22  SELECT 800 AS ID, 2 AS SEQ FROM DUAL
23  UNION ALL
24    SELECT 800 AS ID, 2 AS SEQ FROM DUAL
25    UNION ALL
26  SELECT 800 AS ID, 5 AS SEQ FROM DUAL
27  UNION ALL
28    SELECT 800 AS ID, 5 AS SEQ FROM DUAL)
29  select  id,
30          seq
31  from
32  (select id,
33          seq,
34          sum(diff) over(partition by id) diff
35  from
36  (select id,
37          seq,
38          abs(seq - row_number() over(partition by id order by seq)) diff
39     from t))
40  where diff <> 0;

        ID        SEQ
---------- ----------
       200          1
       200          2
       200          4
       300          1
       300          2
       300          1
       800          1
       800          2
       800          5
       800          2
       800          5

11 rows selected

SQL>



使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表