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

Nhận dòng đầu tiên của THAM GIA NGOÀI TRÁI

Thử GIỮ DENSE_RANK

Nguồn dữ liệu:

CREATE TABLE person
    (person_id int primary key, firstname varchar2(4), lastname varchar2(9))
/
INSERT ALL
    INTO person (person_id, firstname, lastname)
         VALUES (1, 'john', 'lennon')
    INTO person (person_id, firstname, lastname)
         VALUES (2, 'paul', 'mccartney')
SELECT * FROM dual;



CREATE TABLE address
    (person_id int, address_id int primary key, city varchar2(8))
/
INSERT ALL
    INTO address (person_id, address_id, city)
         VALUES (1, 1, 'new york')
    INTO address (person_id, address_id, city)
         VALUES (1, 2, 'england')
    INTO address (person_id, address_id, city)
         VALUES (1, 3, 'japan')
    INTO address (person_id, address_id, city)
         VALUES (2, 4, 'london')
SELECT * FROM dual;

Truy vấn:

    select  

      p.person_id, p.firstname, p.lastname,

      x.recent_city

    from person p
    left join (

        select person_id,      

            min(city) -- can change this to max(city). will work regardless of min/max

            -- important you do this to get the recent: keep(dense_rank last)

            keep(dense_rank last order by address_id) 
               as recent_city

        from address 
        group by person_id


    ) x on x.person_id = p.person_id

Kiểm tra trực tiếp: http://www.sqlfiddle.com/#!4/7b1c9/ 2

Không phải tất cả cơ sở dữ liệu đều có chức năng tương tự với chức năng cửa sổ KEEP DENSE_RANK của Oracle, bạn có thể sử dụng chức năng cửa sổ thuần túy để thay thế:

select  

  p.person_id, p.firstname, p.lastname,

  x.recent_city, x.pick_one_only

from person p
left join (

    select 

        person_id,      

        row_number() over(partition by person_id order by address_id desc) as pick_one_only,
        city as recent_city

    from address 



) x on x.person_id = p.person_id and x.pick_one_only = 1

Kiểm tra trực tiếp: http://www.sqlfiddle.com/#!4/7b1c9/ 48

Hoặc sử dụng thử nghiệm tuple, sẽ hoạt động trên cơ sở dữ liệu không hỗ trợ chức năng cửa sổ:

select  

  p.person_id, p.firstname, p.lastname,

  x.recent_city

from person p
left join (

    select   
        person_id,city as recent_city    
    from address 
    where (person_id,address_id) in

          (select person_id, max(address_id)
           from address
           group by person_id)



) x on x.person_id = p.person_id 

Kiểm tra trực tiếp: http://www.sqlfiddle.com/#!4/7b1c9/ 21

Tuy nhiên, không phải tất cả cơ sở dữ liệu đều hỗ trợ kiểm tra tuple như trong mã trước. Bạn có thể sử dụng JOIN để thay thế:

select  

  p.person_id, p.firstname, p.lastname,

  x.recent_city

from person p
left join (

    select 

        address.person_id,address.city as recent_city

    from address 
    join 
    (
          select person_id, max(address_id) as recent_id
           from address
           group by person_id
    ) r 
    ON address.person_id = r.person_id
    AND address.address_id = r.recent_id



) x on x.person_id = p.person_id 

Kiểm tra trực tiếp: http://www.sqlfiddle.com/#!4/7b1c9/ 24



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. ODAC dường như là lược đồ bảng bộ nhớ đệm?

  2. SSL:400 không có chứng chỉ bắt buộc nào được gửi

  3. Làm thế nào để truy xuất kết quả của chức năng cơ sở dữ liệu Oracle thông qua ODBC?

  4. Làm thế nào để định dạng và sắp xếp một ngày trong Oracle?

  5. 1000000 đến 1M và 1000 đến 1K trong truy vấn oracle