Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Oracle MIN làm hàm phân tích - hành vi kỳ quặc với ORDER BY?

Nếu bạn thêm ORDER BY đến MIN hàm phân tích, bạn biến nó thành một hàm "tối thiểu cho đến nay" hơn là một hàm tối thiểu tổng thể. Đối với hàng cuối cùng cho bất kỳ thứ gì bạn đang phân vùng, kết quả sẽ giống nhau. Nhưng các hàng trước có thể có giá trị "tối thiểu cho đến nay" khác với giá trị tối thiểu chung.

Sử dụng EMP bảng làm ví dụ, bạn có thể thấy rằng mức lương tối thiểu cho đến nay của bộ phận cuối cùng hội tụ về mức tối thiểu chung cho bộ phận. Và bạn có thể thấy rằng giá trị "tối thiểu cho đến nay" cho bất kỳ bộ phận nhất định nào sẽ giảm khi gặp phải các giá trị thấp hơn.

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.

Tất nhiên, sẽ có ý nghĩa hơn nếu sử dụng dạng hàm phân tích này khi bạn đang cố gắng làm một việc gì đó như tính toán kết quả tốt nhất của cá nhân mà bạn có thể sử dụng làm phép so sánh trong các khoảng thời gian trong tương lai. Nếu bạn đang theo dõi điểm số, số dặm hoặc cân nặng đang giảm đi của một cá nhân, thì việc hiển thị những thành tích tốt nhất của cá nhân có thể là một hình thức động lực.

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. trong đó rownum =1 truy vấn mất thời gian trong Oracle

  2. Đừng để dòng suối đánh lừa bạn

  3. Oracle 12c PLSQL SOAP EXTRACTVALUE từ phản hồi mảng

  4. Cách bật trình giả lập Genymotion để sử dụng Internet WIFI mà máy chủ đang sử dụng

  5. Thêm điều kiện trong câu lệnh MERGE trong Oracle SQL cho INSERT / UPDATE