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

Oracle Pilih Tanggal Maks pada Beberapa catatan

Saya rasa Anda perlu menambahkan...

AND outside.asset_tag=inside.asset_tag

...dengan kriteria di ON . Anda daftar.

Juga sebuah RIGHT OUTER JOIN tidak diperlukan. Sebuah INNER JOIN akan memberikan hasil yang sama (dan mungkin lebih efisien), karena tidak boleh ada kombinasi asset_tag dan last_read_date di subquery yang tidak ada di mp_vehicle_asset_profile .

Meski begitu, kueri dapat mengembalikan lebih dari satu baris per tag aset jika ada "ikatan" -- yaitu, beberapa baris dengan last_read_date yang sama . Sebaliknya, jawaban berbasis analitik @Lamak akan secara sewenang-wenang memilih tepat satu baris situasi ini.

Komentar Anda menunjukkan bahwa Anda ingin memutuskan hubungan dengan memilih baris dengan mtr_reading tertinggi untuk last_read_date .

Anda dapat memodifikasi jawaban berbasis analitik @ Lamak untuk melakukan ini dengan mengubah ORDER BY di OVER klausa untuk:

ORDER BY last_read_date DESC, mtr_reading DESC

Jika masih ada ikatan (yaitu, beberapa baris dengan asset_tag yang sama , last_read_date , dan mtr_reading ), kueri akan kembali memilih tepat satu baris.

Anda dapat memodifikasi jawaban berbasis agregat saya untuk memutuskan hubungan menggunakan mtr_reading tertinggi sebagai berikut:

SELECT  
    outside.asset_tag, 
    outside.description,
    outside.asset_type,
    outside.asset_group,
    outside.status_code,
    outside.license_no,
    outside.rentable_yn,
    outside.manufacture_code,
    outside.model,
    outside.manufacture_vin,
    outside.vehicle_yr,
    outside.meter_id,
    outside.mtr_uom,
    outside.mtr_reading,
    outside.last_read_date 
FROM 
    mp_vehicle_asset_profile outside 
    INNER JOIN 
    ( 
        SELECT
            asset_tag, 
            MAX(last_read_date) AS last_read_date,
            MAX(mtr_reading) KEEP (DENSE_RANK FIRST ORDER BY last_read_date DESC) AS mtr_reading
        FROM
            mp_vehicle_asset_profile 
        GROUP BY
            asset_tag 
    ) inside 
    ON 
        outside.asset_tag = inside.asset_tag
        AND
        outside.last_read_date = inside.last_read_date
        AND
        outside.mtr_reading = inside.mtr_reading

Jika masih ada ikatan (yaitu, beberapa baris dengan asset_tag yang sama , last_read_date , dan mtr_reading ), kueri dapat kembali menampilkan lebih dari satu baris.

Satu cara lain yang membedakan jawaban berbasis analitik dan agregat adalah dalam perlakuan mereka terhadap nol. Jika ada asset_tag , last_read_date , atau mtr_reading adalah nol, jawaban berbasis analitik akan mengembalikan baris terkait, tetapi jawaban berbasis agregat tidak akan (karena kondisi kesetaraan dalam gabungan tidak mengevaluasi ke TRUE ketika null terlibat.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PILIH data dari skema lain di Oracle

  2. Apakah ada parser untuk referensi tabel DML Oracle?

  3. Kembalikan Beberapa Nilai dari Fungsi Oracle

  4. menampilkan hasil dari prosedur tersimpan oracle 10g

  5. Kueri yang menampilkan gabungan luar berperilaku berbeda di Oracle 12c