Oracle: Display row number with 'order by' clause

前端 未结 4 1107
独厮守ぢ
独厮守ぢ 2021-02-02 17:14

I wonder how could i print a row number for sql statement where is using order. Currently i tried ROWNUM but as i understand it works only for unsorted result set.

相关标签:
4条回答
  • 2021-02-02 17:39

    Oh. Seems i've found already a solution.

        Select rownum, lg_id, full_name, sort_order from 
    (SELECT a.lg_id, a.full_name, a.sort_order
          FROM activity_type_lang a
          where a.lg_id = 'en'
          order by a.full_name);
    
    0 讨论(0)
  • 2021-02-02 17:40

    In addition to nesting the query, you can use an analytic function

    SELECT row_number() OVER (ORDER BY a.full_name),
           lg_id,
           full_name,
           sort_order
      FROM activity_type_lang a
     WHERE a.lg_id = 'en'
     ORDER BY a.full_name
    

    Using analytic functions also makes it easier if you want to change how ties are handled. You can replace ROW_NUMBER with RANK or DENSE_RANK.

    0 讨论(0)
  • 2021-02-02 17:51

    Hello. I wonder how could i print a row number for sql statement where is using order. Currently i tried ROWNUM but as i understand it works only for unsorted result set.

    To be clear (somebody might get it wrong). It does work (but not in the way you expect). The problem with it is that it "attaches" the ROWNUM before the sort and you get your records but not in consecutive ROWNUM records. Why? Because

    The first record that meets the where criteria in a select statement is given rownum=1

    This is really good example how select / order mechanism works.

    0 讨论(0)
  • 2021-02-02 17:54

    rownum is applied before ordering, so you have to rewrite your query like this: select rownum, xxx.* from ( SELECT a.lg_id, a.full_name, a.sort_order FROM activity_type_lang a where a.lg_id = 'en' order by a.full_name ) xxx;

    0 讨论(0)
提交回复
热议问题