Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Mendapatkan nilai yang berkaitan dengan baris maks dan min di Oracle

Ini mudah dipecahkan dengan fungsi analitik. Seperti yang Anda lihat, ada dua karyawan yang mendapatkan gaji maksimum di DEPT 20; ini adalah detail penting, karena beberapa solusi umum untuk masalah semacam ini melewatkan informasi itu.

SQL> select ename
  2             , deptno
  3             , sal
  4  from (
  5      select ename
  6             , deptno
  7             , sal
  8             , max (sal) over (partition by deptno) max_sal
  9             , min (sal) over (partition by deptno) min_sal
 10      from emp
 11      )
 12  where sal = max_sal
 13  or    sal = min_sal
 14  order by deptno, sal
 15  /

ENAME          DEPTNO        SAL
---------- ---------- ----------
KISHORE            10       1300
SCHNEIDER          10       5000
CLARKE             20        800
RIGBY              20       3000
GASPAROTTO         20       3000
HALL               30        950
LIRA               30       3750
TRICHLER           50       3500
FEUERSTEIN         50       4500

9 rows selected.

SQL>

Ups, saya melewatkan detail penting tentang format hasil. Data saya tidak sesuai dengan output yang diminta, karena ada dua karyawan yang mendapatkan gaji maksimal. Jadi kueri ini, yang saya akui agak canggung, memberi kita tata letak yang diperlukan. MIN() pada nama karyawan mengembalikan urutan abjad :

SQL> select
  2         deptno
  3         , max (case when sal = min_sal then min_sal else null end ) as min_sal
  4         , min (case when sal = min_sal then ename else null end ) as min_name
  5         , max (case when sal = max_sal then max_sal else null end ) as max_sal
  6         , min (case when sal = max_sal then ename else null end ) as max_name
  7  from (
  8      select ename
  9             , deptno
 10             , sal
 11             , max (sal) over (partition by deptno) max_sal
 12             , min (sal) over (partition by deptno) min_sal
 13      from emp
 14      )
 15  where sal = max_sal
 16  or    sal = min_sal
 17  group by deptno
 18  order by deptno
 19  /

    DEPTNO    MIN_SAL MIN_NAME      MAX_SAL MAX_NAME
---------- ---------- ---------- ---------- ----------
        10       1300 KISHORE          5000 SCHNEIDER
        20        800 CLARKE           3000 GASPAROTTO
        30        950 HALL             3750 LIRA
        50       3500 TRICHLER         4500 FEUERSTEIN

SQL>

Saya tidak suka solusi ini. Sebagian besar kumpulan data akan berisi bentrokan seperti itu, dan kita perlu mengakuinya. Memfilter hasil berdasarkan beberapa kriteria yang tidak terkait agar sesuai dengan tata letak laporan Procrustean adalah menyesatkan. Saya lebih suka tata letak laporan yang mencerminkan seluruh kumpulan data. Pada akhirnya itu tergantung pada tujuan bisnis yang dilayani kueri. Dan, tentu saja, pelanggan selalu benar 8-)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL Query:Kembalikan catatan nilai Maks dari Grup

  2. Memanggil Python dari Oracle

  3. Bagaimana saya bisa memperbarui data di bidang CLOB menggunakan>> kueri yang disiapkan <<dengan ODP (Oracle.DataAccess)?

  4. Oracle:Menggunakan CTE dengan klausa pembaruan

  5. Migrasi Data Dari Oracle Ke SQL Server