sql >> データベース >  >> RDS >> Oracle

分析関数としてのOracleMIN-ORDERBYでの奇妙な動作?

    ORDER BYを追加した場合 MINへ 分析関数では、全体的な最小値ではなく、「これまでの最小」関数に変換します。パーティション分割するものの最終行では、結果は同じになります。ただし、前の行の「これまでの最小値」は、全体の最小値とは異なる場合があります。

    EMPの使用 表を例にとると、部門のこれまでの最低給与は、最終的に部門の全体的な最低賃金に収束することがわかります。また、特定の部門の「これまでの最小値」の値は、低い値に遭遇すると減少することがわかります。

    SQL> ed
    Wrote file afiedt.buf
    
      1  select ename,
      2         deptno,
      3         sal,
      4         min(sal) over (partition by deptno order by ename) min_so_far,
      5         min(sal) over (partition by deptno) min_overall
      6    from emp
      7*  order by deptno, ename
    SQL> /
    
    ENAME          DEPTNO        SAL MIN_SO_FAR MIN_OVERALL
    ---------- ---------- ---------- ---------- -----------
    CLARK              10       2450       2450        1300
    KING               10       5000       2450        1300
    MILLER             10       1300       1300        1300
    ADAMS              20       1110       1110         800
    FORD               20       3000       1110         800
    JONES              20       2975       1110         800
    SCOTT              20       3000       1110         800
    smith              20        800        800         800
    ALLEN              30       1600       1600         950
    BLAKE              30       2850       1600         950
    MARTIN             30       1250       1250         950
    SM0                30        950        950         950
    TURNER             30       1500        950         950
    WARD               30       1250        950         950
    BAR
    PAV
    
    16 rows selected.
    

    もちろん、将来の比較として使用できる個人的なベストを計算するようなことをしようとしているときは、この形式の分析関数を使用する方が理にかなっています。個人のゴルフスコア、マイルタイム、または体重の減少を追跡している場合、個人のベストを表示することはモチベーションの一形態になります。

    SQL> ed
    Wrote file afiedt.buf
    
      1  with golf_scores as
      2  (  select 1 golfer_id, 80 score, sysdate dt from dual union all
      3     select 1, 82, sysdate+1 dt from dual union all
      4     select 1, 72, sysdate+2 dt from dual union all
      5     select 1, 75, sysdate+3 dt from dual union all
      6     select 1, 71, sysdate+4 dt from dual union all
      7     select 2, 74, sysdate from dual )
      8  select golfer_id,
      9         score,
     10         dt,
     11         (case when score=personal_best
     12               then 'New personal best'
     13               else null
     14           end) msg
     15    from (
     16  select golfer_id,
     17         score,
     18         dt,
     19         min(score) over (partition by golfer_id
     20                              order by dt) personal_best
     21    from golf_scores
     22*        )
    SQL> /
    
     GOLFER_ID      SCORE DT        MSG
    ---------- ---------- --------- -----------------
             1         80 12-SEP-11 New personal best
             1         82 13-SEP-11
             1         72 14-SEP-11 New personal best
             1         75 15-SEP-11
             1         71 16-SEP-11 New personal best
             2         74 12-SEP-11 New personal best
    
    6 rows selected.
    



    1. php print_rに表示されているが、mysqlには保存されていないバイナリファイルの内容

    2. MySQLシステムデータベーステーブルをInnoDBに変換できますか?

    3. Postgresの自然秩序

    4. 参照Microsoft.SqlServer.Smo.dll