0

私はオラクルに問題があり、制限付きの単純な選択を作成するだけですが、オラクルはこの機能を持っていないので、そのようなものを書きました

:

     select b.strdir,b.num, b.value, b.time  

          from mytable b
         where b.dev_id = 223
           and b.cur_id = 23
           and b.time=(
                select xx.time from mytable xx
                where xx.dev_id = b.dev_id and xx.cur_id = b.cur_id and xx.nom = b.nom
                and rownum=1
                order by xx.time DESC
               )

         order by b.strdir nulls first;

しかし、それは機能していませんplz help :/

4

4 に答える 4

4

このタイプのクエリは、最初/最後の集計関数 ("keep 句" とも呼ばれます) を使用して処理するのが最適ですが、クエリをテストしていません。

select max(b.strdir) keep (dense_rank last order by b.time) strdir
     , max(b.num) keep (dense_rank last order by b.time) num
     , max(b.value) keep (dense_rank last order by b.time) value
     , max(b.time) time  
  from mytable b
 where b.dev_id = 223
   and b.cur_id = 23
 group by b.nom
 order by strdir nulls first

http://rwijk.blogspot.com/2012/09/keep-clause.html

よろしく、
ロブ。

于 2012-10-03T07:28:39.520 に答える
1

dev_id と row_id のペアを最新の時刻で取得するには、次を使用します。

 select b.strdir,b.num, b.value, b.time  
      from mytable b
     where b.dev_id = 223
       and b.cur_id = 23
       and b.time =(
            select max(xx.time) from mytable xx
            where xx.dev_id = b.dev_id and xx.cur_id = b.cur_id 
              and xx.nom = b.nom --> not sure this line is necessary
           )
     order by b.strdir nulls first;

ROWNUM = 1が適用された時点で、 は のに実行SORT BYされるため、 句は無視されることに注意してください。解決策は、最新の時刻を見つけるためのサブクエリを使用することです。SORT BYWHEREMAX(time)

timeまた、同一の値を持つ行が存在する可能性がある場合、重複する行が返されるリスクにも注意してください。SELECT DISTINCTこれに対する考えられる解決策の 1 つは、外側の SQL でa を使用することです。

于 2012-10-03T08:05:34.343 に答える
1

Oracleは、行が述語を通過した後にrownumを割り当てるため、where句は何も通過しません。OracleでTOP nを選択する標準的な方法は次のとおりです。

select * from ( <your statement> ) where rownum <= N
于 2012-10-03T06:49:32.237 に答える
0
    select b.strdir,b.num, b.value, b.time  

      from mytable b
     where b.dev_id = 223
       and b.cur_id = 23
       and b.time=(
            select max(xx.time) from mytable xx
            where xx.dev_id = b.dev_id and xx.cur_id = b.cur_id and xx.nom = b.nom

           )

     order by b.strdir nulls first;

これは良いバージョンですか?max(xx.time)

于 2012-10-03T07:37:53.137 に答える