ITPUB论坛-中国最专业的IT技术社区

 找回密码
 注册
查看: 654|回复: 12

[SQL] 表中一个字段有大小不等的数值,怎么取出所有小于前n个数,也小于后n个数值的数(n...

[复制链接]
论坛徽章:
3
2013年新春福章
日期:2013-02-25 11:02:122013年新春福章
日期:2013-02-25 14:51:24茶鸡蛋
日期:2013-07-01 10:57:47
发表于 2018-4-28 09:59 | 显示全部楼层 |阅读模式
表中一个字段有大小不等的数值,怎么取出所有小于前n个数,也小于后n个数值的数(n可以是1也可以是10)?举个例
5
3
1
7
6
3
8
9

这里小于前2个数,也小于后两个数的数是 1和3.
论坛徽章:
496
目光如炬
日期:2015-11-22 22:00:00秀才
日期:2016-01-06 14:10:21秀才
日期:2016-01-06 14:10:21秀才
日期:2016-01-06 14:10:21秀才
日期:2016-01-06 14:10:21秀才
日期:2016-01-06 14:10:21秀才
日期:2016-01-06 14:10:21秀才
日期:2016-01-06 14:10:21探花
日期:2016-01-06 14:11:18进士
日期:2016-01-06 14:11:18
发表于 2018-4-28 11:57 | 显示全部楼层
表中的数据是无序的,你必须现有一个排序方法,才能定义出所谓的前N个后N个。没有ORDER BY得到的顺序都是随机结果。
你还得说清楚重复的数据要怎么处理,除非你的所有数据都是唯一的。
参见置顶帖提问的智慧。

使用道具 举报

回复
论坛徽章:
3
2013年新春福章
日期:2013-02-25 11:02:122013年新春福章
日期:2013-02-25 14:51:24茶鸡蛋
日期:2013-07-01 10:57:47
 楼主| 发表于 2018-5-3 16:25 | 显示全部楼层
newkid 发表于 2018-4-28 11:57
表中的数据是无序的,你必须现有一个排序方法,才能定义出所谓的前N个后N个。没有ORDER BY得到的顺序都是随 ...

当然有个id列是有序的

使用道具 举报

回复
论坛徽章:
496
目光如炬
日期:2015-11-22 22:00:00秀才
日期:2016-01-06 14:10:21秀才
日期:2016-01-06 14:10:21秀才
日期:2016-01-06 14:10:21秀才
日期:2016-01-06 14:10:21秀才
日期:2016-01-06 14:10:21秀才
日期:2016-01-06 14:10:21秀才
日期:2016-01-06 14:10:21探花
日期:2016-01-06 14:11:18进士
日期:2016-01-06 14:11:18
发表于 2018-5-3 17:57 | 显示全部楼层

使用道具 举报

回复
认证徽章
论坛徽章:
1
秀才
日期:2016-04-21 14:08:53
发表于 2018-5-3 18:44 | 显示全部楼层
蠢办法来抛砖引玉,这个sql实质上是求出前N行和后N行之中的最小值,然后取出<=该最小值的即可:
--创建测试表
create table test(no number,id number);

--插入测试数据
Insert into  TEST
   (id, no)
Values
   (1, 5);
Insert into  TEST
   (id, no)
Values
   (2, 3);
Insert into  TEST
   (id, no)
Values
   (3, 1);
Insert into  TEST
   (id, no)
Values
   (4, 7);
Insert into  TEST
   (id, no)
Values
   (5, 6);
Insert into  TEST
   (id, no)
Values
   (6, 3);
Insert into  TEST
   (id, no)
Values
   (7, 8);
Insert into  TEST
   (id, no)
Values
   (8, 9);
COMMIT;

--以n=2为例,取<=前2行和<=后2行的交集,结果得到1,3
select no from test where no<=(
select min(no) from (
select no from test order by id asc
) where rownum<=2)
intersect
select no from test where no<=(
select min(no) from (
select no from test order by id desc
) where rownum<=2)

使用道具 举报

回复
论坛徽章:
399
优秀写手
日期:2013-12-18 09:29:08itpub13周年纪念徽章
日期:2014-09-28 10:55:55itpub13周年纪念徽章
日期:2014-10-01 15:27:22itpub13周年纪念徽章
日期:2014-10-09 12:04:18马上有钱
日期:2014-10-14 21:37:37马上有钱
日期:2015-01-22 00:39:13喜羊羊
日期:2015-02-20 22:26:07懒羊羊
日期:2015-02-21 22:03:31懒羊羊
日期:2015-03-04 14:52:112015年新春福章
日期:2015-03-06 11:58:18
发表于 2018-5-3 19:28 来自手机 | 显示全部楼层
3<3?

使用道具 举报

回复
论坛徽章:
399
优秀写手
日期:2013-12-18 09:29:08itpub13周年纪念徽章
日期:2014-09-28 10:55:55itpub13周年纪念徽章
日期:2014-10-01 15:27:22itpub13周年纪念徽章
日期:2014-10-09 12:04:18马上有钱
日期:2014-10-14 21:37:37马上有钱
日期:2015-01-22 00:39:13喜羊羊
日期:2015-02-20 22:26:07懒羊羊
日期:2015-02-21 22:03:31懒羊羊
日期:2015-03-04 14:52:112015年新春福章
日期:2015-03-06 11:58:18
发表于 2018-5-3 19:30 来自手机 | 显示全部楼层
大小不等就是不重复?怎么有2个3

使用道具 举报

回复
论坛徽章:
496
目光如炬
日期:2015-11-22 22:00:00秀才
日期:2016-01-06 14:10:21秀才
日期:2016-01-06 14:10:21秀才
日期:2016-01-06 14:10:21秀才
日期:2016-01-06 14:10:21秀才
日期:2016-01-06 14:10:21秀才
日期:2016-01-06 14:10:21秀才
日期:2016-01-06 14:10:21探花
日期:2016-01-06 14:11:18进士
日期:2016-01-06 14:11:18
发表于 2018-5-4 15:17 | 显示全部楼层
Dimsen 发表于 2018-5-3 18:44
蠢办法来抛砖引玉,这个sql实质上是求出前N行和后N行之中的最小值,然后取出

思路是对的,但是SQL是错的。你的标量子查询和外层没有相关条件,不能限制范围在前后N个。

使用道具 举报

回复
论坛徽章:
496
目光如炬
日期:2015-11-22 22:00:00秀才
日期:2016-01-06 14:10:21秀才
日期:2016-01-06 14:10:21秀才
日期:2016-01-06 14:10:21秀才
日期:2016-01-06 14:10:21秀才
日期:2016-01-06 14:10:21秀才
日期:2016-01-06 14:10:21秀才
日期:2016-01-06 14:10:21探花
日期:2016-01-06 14:11:18进士
日期:2016-01-06 14:11:18
发表于 2018-5-4 15:18 | 显示全部楼层
〇〇 发表于 2018-5-3 19:30
大小不等就是不重复?怎么有2个3

我在2楼已经问过重复的问题,楼主很跩地没有理会。

使用道具 举报

回复
论坛徽章:
0
发表于 2018-5-15 15:24 | 显示全部楼层
猜测楼主意思:按照id排序,该表的num字段值 小于id排序后前两个的num字段值&&小于id排序后后两个的num字段值。
        --1、建表
create table mytab(
my_id varchar2(10),
my_num number(10)
);
        --2、数据不多,直接forupdate手工写入
select * from mytab for update;
        --3、查询语句
select m.*
  from mytab m
where exists (select 1
          from (select t.my_id,
                       t.my_num,
                       row_number() over(partition by 1 order by t.my_id asc) row_num
                  from mytab t) tb
         where tb.row_num = 2
           and m.my_num < tb.my_num)
   and exists (select 1
          from (select t.my_id,
                       t.my_num,
                       row_number() over(partition by 1 order by t.my_id desc) row_num
                  from mytab t) bm
         where bm.row_num = 2
           and m.my_num < bm.my_num);

使用道具 举报

回复

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

本版积分规则

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