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

Oracle Chọn Ngày Tối đa trên Nhiều bản ghi

Tôi nghĩ bạn cần thêm ...

AND outside.asset_tag=inside.asset_tag

... theo tiêu chí trong ON của bạn danh sách.

Cũng là một RIGHT OUTER JOIN là không cần thiết. INNER JOIN sẽ cho kết quả giống nhau (và có thể hiệu quả hơn), vì sẽ không thể có sự kết hợp của asset_taglast_read_date trong truy vấn con không tồn tại trong mp_vehicle_asset_profile .

Ngay cả khi đó, truy vấn có thể trả về nhiều hơn một hàng cho mỗi thẻ nội dung nếu có "ràng buộc" - nghĩa là nhiều hàng có cùng một last_read_date . Ngược lại, câu trả lời dựa trên phân tích của @ Lamak sẽ tùy ý chọn chính xác một hàng trong trường hợp này.

Nhận xét của bạn cho thấy rằng bạn muốn phá vỡ mối quan hệ bằng cách chọn hàng có mtr_reading cao nhất cho last_read_date .

Bạn có thể sửa đổi câu trả lời dựa trên phân tích của @ Lamak để thực hiện điều này bằng cách thay đổi ORDER BY trong OVER mệnh đề:

ORDER BY last_read_date DESC, mtr_reading DESC

Nếu vẫn có mối ràng buộc (nghĩa là nhiều hàng có cùng một asset_tag , last_read_datemtr_reading ), truy vấn sẽ lại chọn chính xác một hàng một cách tùy ý.

Bạn có thể sửa đổi câu trả lời dựa trên tổng hợp của tôi để phá vỡ mối quan hệ bằng cách sử dụng mtr_reading cao nhất như sau:

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

Nếu vẫn có mối ràng buộc (nghĩa là nhiều hàng có cùng một asset_tag , last_read_datemtr_reading ), truy vấn có thể trả lại nhiều hơn một hàng.

Một cách khác mà các câu trả lời dựa trên phân tích và tổng hợp khác nhau là ở cách xử lý các giá trị rỗng. Nếu bất kỳ asset_tag nào , last_read_date hoặc mtr_reading là null, câu trả lời dựa trên phân tích sẽ trả về các hàng có liên quan, nhưng câu trả lời dựa trên tổng hợp sẽ không (bởi vì các điều kiện bình đẳng trong phép nối không đánh giá thành TRUE khi một null có liên quan.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm thế nào để chèn / cập nhật kích thước lớn hơn của dữ liệu trong bảng Oracle?

  2. Oracle SQL chèn vào với mệnh đề With

  3. Cách chọn nhóm hàng liên tục đầu tiên bằng Oracle SQL

  4. Làm mới nhanh khi cam kết chế độ xem cụ thể hóa

  5. Làm thế nào để thực hiện các công việc trong oracle?