精华内容
下载资源
问答
  • (https://img-ask.csdn.net/upload/201509/25/1443167518_195061.jpg) Oracel中,我想在子查询中先分组,在排序,最后在外层做一个,取排序后结果的前10条结果
  • Oracle查询排序后前10条记录

    万次阅读 2019-07-19 19:21:29
    查询表CMS_GPS中,车牌号为“苏EFN588”,时间最近的前10条记录, 不可以写成下面这样,这样写是先搜索出前10条记录,然后再按时间倒序排列, SELECT * FROM CMS_GPS WHERE VEHICLE_NO = '苏EFN588' AND ROWNUM &...

    查询表CMS_GPS中,车牌号为“苏EFN588”,时间最近的前10条记录,

    不可以写成下面这样,这样写是先搜索出前10条记录,然后再按时间倒序排列,

    SELECT * FROM CMS_GPS WHERE VEHICLE_NO = '苏EFN588' AND ROWNUM <11 ORDER BY TIMESTAMPS DESC;

    第一种方法:

    先查子表,按时间排序,并添加序号,主表查字表时筛选序号<11的,

    SELECT * FROM 
    (SELECT CG.*,ROWNUM rn FROM CMS_GPS CG WHERE VEHICLE_NO = '苏EFN588' ORDER BY TIMESTAMPS DESC)
    WHERE rn < 11;

    注意

    1. * 和 ROWNUM 一起查询时候,*前面必须加表名称做前缀,即 select CG.* , ROWNUM.....
    2. ROWNUM 不能以任何表的名称作为前缀,CG.ROWNUM 是非法的。
    3. rownum和排序:rownum在前,order by在后,rownum的是在取数据的时候产生的序号,而不是order by后产生的序号,想要按照排序后的结果编号,必须用子查询。

    SQL> select rownum ,id,name from student order by name;
        ROWNUM ID     NAME
    ---------- ------ ---------------------------------------------------
             3 200003 李三
             2 200002 王二
             1 200001 张一
             4 200004 赵四
    可以看出,rownum并不是按照排序后的列来生成的序号。系统是按照记录插入时的顺序来编号的

    为了获得排序后的编号,必须使用子查询;
    SQL> select rownum ,id,name from (select * from student order by name);
        ROWNUM ID     NAME
    ---------- ------ ---------------------------------------------------
             1 200003 李三
             2 200002 王二
             3 200001 张一
             4 200004 赵四

     

    第一种效率低,提供效率更高的第二种方法,

    第二种方法:

    先查字表,按时间排序,主表查字表时,自动生成伪列,并查询伪列ROWNUM<11的,

    SELECT * FROM 
    (SELECT * FROM CMS_GPS WHERE VEHICLE_NO = '苏EFN588' ORDER BY TIMESTAMPS DESC)
    WHERE rownum < 11;

    查询第5-10条数据:

    select * from (select CG.*,rownum as rn from CMS_GPS CG where VEHICLE_NO = '苏EFN588' and rownum<11) where rn>6;

    查询时间最近的第5-10条数据:

    select * from 
    	(SELECT aaa.*,ROWNUM rn FROM 
    		(SELECT * FROM CMS_GPS WHERE VEHICLE_NO = '苏EFN588' ORDER BY TIMESTAMPS DESC) aaa
    		WHERE rownum < 11
    	)
    where rn>4;
    

    错误示范:

     ORACLE查询第N~M条记录的方法:

    select * from (select a.*,a.rownum rn from (select * from table_name) a where a.rownum<M) where rn>n
    --这句就是从n到m也的数据,分为三层结构

    第一个错误:rownum前面不可以加表名做前缀,第二,三层结构太繁琐,可以优化为二层结构,

    select * from (select a.*,rownum rn from table_name a where rownum<M) where rn >n;

    MYSQL查询前10条、第2~10条记录的方法:

    select * from table_name limit 0,10  --通常0是可以省略的,直接写成  limit 10。0代表从第0条记录后面开始,也就是从第一条开始
    select * from table_name limit 1,10  --则为从第一条后面的记录开始展示,也就是说从第二条开始。

    MSSQL查询前10条的方法为:

    select top X * from table_name  --查询前X条记录,可以改成需要的数字。
    select top n * from (select top m * from table_name order by column_name ) a order by column_name desc  --查询第N到M条记录。常用的分页也是这种方式。
    例如常用的分页方式:
    declare @page int
    declare @row int
    set @page=2 --页数
    set @row=3  --每页展示行数
    select top (@row) * from (select top (@row*@page) * from table_name order by id  ) a order by id desc  --最基本的分页方式,改变@row和@page达到分页效果

     

     

    展开全文
  • 今天写一个页面,要求是查询排序后数据,遇到一个不大不小的坑,特此记录下 说明下:SQLSERVER中是用top查询数据,ORACLE没有top,但是可以用ROWNUM实现。 我写的语句是: SELECT*FROMTABLE_NAME ...

    今天写一个页面,要求是查询排序后的前五条数据,遇到一个不大不小的坑,特此记录下

    说明下:SQL   SERVER中是用top查询前几条数据,ORACLE没有top,但是可以用ROWNUM实现。

    我写的语句是:

          SELECT   *   FROM   TABLE_NAME  t  WHERE   ROWNUM  <= 5   ORDER  BY  t.PRICE DESC;

    发现查询出来的数据并不是表中价格最高的前五条,而是数据库中前五条记录排序后的结果

     

    后改为

          SELECT   *   FROM   (SELECT   *    FROM    TABLE_NAME   t  ORDER  BY   t.PRICE DESC)  WHERE   ROWNUM <= 5;

    得到预期的结果。

    两者的不同就在于 前者先取出五条数据然后进行排序,后者先将表中所有数据排序,再取出前五条。

     

    展开全文
  • oracle排序然后再从排序后的数据中取前 select * from (select * from t order by col1) where rownum&lt;10

    oracle先排序然后再从排序后的数据中取前几条

    select * from (select * from t order by col1) where rownum<10
    
    展开全文
  • 关于Oracle排序后取前几行的问题

    千次阅读 2019-01-18 12:25:26
    关于Oracle排序后取前几行的问题
                   

     查询语句一、

        SELECT V.STAMP,TO_CHAR(V.GPSTIME,'YYYY-MM-DD HH24:MI:SS'),V.PHOTOURL,V.SMALLPHOTOURL,V.TOUCH_OFF,V.VIDICON_NO,V.SPEED,V.COURSE,V.STATE
           FROM T_VEHICLE_PHOTO V
          WHERE V.ISMANAGE = 0
            AND V.TOUCH_OFF = 27
            AND V.NUMBER_PLATE = '苏F14899'
            AND V.STAMP < TO_DATE('2008-11-02 10:00:00', 'YYYY-MM-DD HH24:MI:SS')
            AND ROWNUM <= 6
          ORDER BY V.STAMP desc

     

    查询语句二、

         SELECT V.STAMP,TO_CHAR(V.GPSTIME,'YYYY-MM-DD HH24:MI:SS'),V.PHOTOURL,V.SMALLPHOTOURL,V.TOUCH_OFF,V.VIDICON_NO,V.SPEED,V.COURSE,V.STATE
           FROM T_VEHICLE_PHOTO V
          WHERE V.ISMANAGE = 0
            AND V.TOUCH_OFF = 27
            AND V.NUMBER_PLATE = '苏F14899'
            AND V.STAMP < TO_DATE('2008-11-02 10:00:00', 'YYYY-MM-DD HH24:MI:SS')
            AND ROWNUM <6
          ORDER BY V.STAMP desc

     

    查询语句一的结果:

    STAMP

    2008-11-2 8:11:52
    2008-11-1 8:02:09
    2008-10-31 17:16:02
    2008-10-31 13:41:58
    2008-10-31 10:53:00
    2008-10-31 7:24:57

     

    查询语句二的结果:

    STAMP

    2008-11-1 8:02:09
    2008-10-31 17:16:02
    2008-10-31 13:41:58
    2008-10-31 10:53:00
    2008-10-31 7:24:57

     

    不加行数限制的结果:

    2008-11-2 8:11:52
    2008-11-2 7:27:57
    2008-11-1 17:44:29
    2008-11-1 14:32:07
    2008-11-1 11:44:59
    2008-11-1 8:02:09
    2008-10-31 17:16:02
    2008-10-31 13:41:58
    2008-10-31 10:53:00
    2008-10-31 7:24:57
    2008-10-30 17:36:48

     

    由此可以看出,如果不使用<=你拿到的数据会少一行,并且很奇怪是第一行,正常要想法应是最后一行才对,那么现在在比较以下两种写法:

     

    select 标题,发布时间 from (select 标题,发布时间 from hhsys.tongzhigonggao order by 发布时间 desc) where rownum<11 

     

    这样是拿排序后的前10

     

    select 标题,发布时间 from hhsys.tongzhigonggao where rownum<=10 order by 发布时间 desc

     

    这样的话应是拿到前10行再进行排序,但他实际上又是拿到排序后的前10行,真搞不明白。

     

     

    噢,弄明白,了上面的语句写法是错误的。

     

     

    正确的语句如下:

         SELECT * FROM (
         SELECT V.STAMP,TO_CHAR(V.GPSTIME,'YYYY-MM-DD HH24:MI:SS'),V.PHOTOURL,V.SMALLPHOTOURL,V.TOUCH_OFF,V.VIDICON_NO,V.SPEED,V.COURSE,V.STATE
           FROM T_VEHICLE_PHOTO V
          WHERE V.ISMANAGE = 0
            AND V.TOUCH_OFF = 27
            AND V.NUMBER_PLATE = '苏F14899'
            AND V.STAMP < TO_DATE('2008-11-02 10:00:00', 'YYYY-MM-DD HH24:MI:SS') 
          ORDER BY V.STAMP DESC
          ) WHERE ROWNUM <= 6

     

    也就是,如果你要取排序后的结果,不能将ROWNUM <= 6放在order by前面。

    =======================================================================

         SELECT V.STAMP,TO_CHAR(V.GPSTIME,'YYYY-MM-DD HH24:MI:SS'),V.PHOTOURL,V.SMALLPHOTOURL,V.TOUCH_OFF,V.VIDICON_NO,V.SPEED,V.COURSE,V.STATE
           FROM T_VEHICLE_PHOTO V
          WHERE V.ISMANAGE = 0
            AND V.TOUCH_OFF = 27
            AND V.NUMBER_PLATE = '苏F14899'
            AND V.STAMP < TO_DATE('2008-11-02 10:00:00', 'YYYY-MM-DD HH24:MI:SS')

    正常数据:

    1 2008-10-31 7:24:57
    2 2008-10-31 10:53:00
    3 2008-10-31 13:41:58
    4 2008-10-31 17:16:02
    5 2008-11-1 8:02:09
    6 2008-11-2 8:11:52
    7 2008-11-1 11:44:59
    8 2008-11-1 14:32:07
    9 2008-11-1 17:44:29
    10 2008-11-2 7:27:57
    11 2008-10-30 17:36:48

     

    ===================================================

         SELECT V.STAMP,TO_CHAR(V.GPSTIME,'YYYY-MM-DD HH24:MI:SS'),V.PHOTOURL,V.SMALLPHOTOURL,V.TOUCH_OFF,V.VIDICON_NO,V.SPEED,V.COURSE,V.STATE
           FROM T_VEHICLE_PHOTO V
          WHERE V.ISMANAGE = 0
            AND V.TOUCH_OFF = 27
            AND V.NUMBER_PLATE = '苏F14899'
            AND V.STAMP < TO_DATE('2008-11-02 10:00:00', 'YYYY-MM-DD HH24:MI:SS')
            AND ROWNUM <= 6

    取前6行数据:
    1 2008-10-31 7:24:57
    2 2008-10-31 10:53:00
    3 2008-10-31 13:41:58
    4 2008-10-31 17:16:02
    5 2008-11-1 8:02:09
    6 2008-11-2 8:11:52

     

    =========================================================

         SELECT V.STAMP,TO_CHAR(V.GPSTIME,'YYYY-MM-DD HH24:MI:SS'),V.PHOTOURL,V.SMALLPHOTOURL,V.TOUCH_OFF,V.VIDICON_NO,V.SPEED,V.COURSE,V.STATE
           FROM T_VEHICLE_PHOTO V
          WHERE V.ISMANAGE = 0
            AND V.TOUCH_OFF = 27
            AND V.NUMBER_PLATE = '苏F14899'
            AND V.STAMP < TO_DATE('2008-11-02 10:00:00', 'YYYY-MM-DD HH24:MI:SS')
            AND ROWNUM <= 6
          ORDER BY V.STAMP DESC
    取前6行然后排序的数据:

    1 2008-11-2 8:11:52
    2 2008-11-1 8:02:09
    3 2008-10-31 17:16:02
    4 2008-10-31 13:41:58
    5 2008-10-31 10:53:00
    6 2008-10-31 7:24:57

     

    总结:

    取排序后的前几行,应该用:

    select * from(select * from test order by stamp desc) where rownum<= 6  (表示排序后取前几行)

     

    而不应该使用:

    select * from test where rownum<= 6  order by stamp desc (表示取前几行后再排序)

               

    再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow

    展开全文
  • select * from ( select t., row_number() over (partition by user_sid order by sid desc) rn ,count() over (partition by user_sid) nums from sys_user_rel t where user_sid in (select sid from sys_user ...
  • 主要介绍了Oracle结合Mybatis实现表TOP 10条数据的相关资料,需要的朋友可以参考下
  • ②分组排序后取第一的效果: 二、sql语句 2.1、基础语句 select t.* from (select a.*, row_number() over(partition by 需要分组的字段 order by 排序的字段 desc) rw from 表 a) t where t.rw = 1 ...
  • 一、oracle中的rownum排序方法 select t.* from test_ord_log t where rownum<10 order by trans_Date desc:###意思为从该表中获取10条数据 然后再按照...###意思为将该表按照日期排序,然后再取前十条数据使用 ...
  • 今天在工作中遇到了类似的...我的问题是分组查询每组金币数最多的前10名,使用了 select * from ( SELECT a(需要分组的字段),b(需要排序的字段) ,c(其他想要的字段:例如用户名称),row_number() OVER(PARTITION BY...
  • oracle分组排序取前

    2020-09-12 15:32:08
    2、根据要求取出1中已经分组排序好的多少行的数据;  1.row_number() over() row_number()over(partition by col1 order by col2)表示根据col1分组,再分组内部根据col2排序,而此函数计算的值就表示每组内部...
  • oracle排序后查询数据

    千次阅读 2018-02-27 17:36:16
    SQL SERVER中可以用top关键字查询符合条件的记录。(select top 10 ......)ORACLE中没有top关键字,应该怎么查询呢?方法如下:1、sql语句:SELECT * FROM (SELECT * FROM TABLE_A TA ORDER BY...
  • 表示按id降序后取前6行 select * from(select * from test order by id desc) where rownum<= 6 ; 表示取前6行再按id降序 select * from test where rownum<= 6 order by id desc ; mysql 表示先...
  • 需求:查询一天中第一和最后一数据 原始表 select * from table1 ; 步骤1:使用row_number() over() 函数对时间排序,一个正序,一个倒序。 select t.name, t.sex, t.time, row_number() over(order by t....
  • oracle 实现分组后排序取第一

    千次阅读 2019-08-07 18:46:16
    1.这里要将数据按PARTNER_ID 分组并且按时间排序取第一 select * from ( SELECT ROW_NUMBER()over(PARTITION by PARTNER_ID ORDER BY VISIT_DATE DESC) as ro,v.PARTNER_ID,v.VISIT_DATE from VISIT_INFO v ...
  • oracle数据库排序后获取第一数据

    千次阅读 2020-10-10 10:44:11
    想要获取下列sql的数据的第一 select NEXT_FOLLOWUP_DATE from PH_CHILD_HEALTH_EXAM where person_info_id = '3afc119ab460497d85f59b1e135ea6b1' order by followup_Visit_Date desc 实现: select NEXT_...
  • 用minus 3000和5000的差值 ...----排序后取序列为3000-5000的数据 select * from table_name t where rownum<=5000 order by t.sn asc minus select * from table_name t where rownum<=3000 ; ...
  • select * from (select * from tablename order by columnname desc) where rownum <=10 转载于:https://www.cnblogs.com/jameshappy/archive/2012/05/23/2515017.html...
  • 项目中用到Oracle分组查询每组排序后N记录,group by 只能返回每个组的单统计。所以用OVER(PARTITION BY)函数,具体详见baidu.com 建个测试表test_abc,如图: 要求查询出按B字段进行分组,每组C值...
  • 如题 oracle left join 怎么取前10条数据? 求大神帮帮忙,谢谢了
  • oracle sql 排序后取出

    千次阅读 2015-03-16 14:36:09
    数据排序后,取出
  • oracle sql rownum    在查询中,我们可以注意到,类似于“select xx from table where rownum 1)这样的查询是有正确含义的,而“select xx from table where rownum = n”这样的查询只在n=1的时候成立,...
  • ,得到每个分组中分数最高的那一数据: SELECT t1.* FROM student t1 JOIN ( SELECT student_id, max( line ) AS line FROM student GROUP BY student_id ) AS t2 ON t1.student_id = t2.student_id AND t1....
  • oracle排序后获取第一数据

    万次阅读 多人点赞 2014-05-18 09:53:46
    首先想说下,其实很简单的 ...主要是顺序不对,select * from testStudent where rownum=1 执行到这里的时候其实只有一数据了 order by id desc 在进行降序排序也没有什么意思 应为只有一语句了
  • < select id = "selectRealTimeMonitorPaging" parameterType ..."realTimeMonitorEntity" ...partition by 以此字段为分组 order by 以此字段排序 desc ) rn from 表 ) where rn = 1 -- 表示第一个
  • 需求:先分组,再按时间排序,最后分组第一 利用oracle的开窗函数可以实现 以下是模板sql ,自行替换 select t.* from (select a.*, row_number() over(partition by 需要分组的字段 order by 更新时间 ...
  • Oracle去重 并按时间排序取第一

    千次阅读 2019-09-26 10:19:05
    按图所示,根据gfwtf_id 去重,并去重的条件是去最新创建的一 第一种实现方法: select t.* from (select a.*, row_number() over(partition by 需要分组的字段 order by 更新时间 desc) rw from 表 a) t ...
  •  select * from (select 表.*, row_number() over(partition by 以此字段为分组 order by 以此字段排序 desc) rn from 表) where rn=1 --表示第一个
  • 这里需要使用到oracle的over()函数 over()函数写法over(partition by expr2 order by expr3),根据expr2对结果进行分区,在各分区内按照expr3进行排序; over函数不能单独使用,需要与row_number(),rank()和dense_...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 51,619
精华内容 20,647
关键字:

oracle排序后取前10条