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

Nhận số lượng bản ghi DUY NHẤT TỔNG THỂ cho mỗi giá trị

Tôi đã lập bảng để thử nghiệm:

create table nr_pvo_120 (
   otherid,
   fax
)
as
select 12365092    , 2762364204 from dual union all
select 12005656    , 2762364204 from dual union all
select 12484936    , 2762364204 from dual union all
select 39003042    , 2762364204 from dual union all
select 12365597    , 2762364204 from dual union all
select 12635922    , 2762364204 from dual union all
select 12332346    , 2762364204 from dual union all
select 12365092    , 4387267572 from dual union all
select 12005656    , 4387267572 from dual union all
select 12365092    , 4422911281 from dual union all
select 12005656    , 4422911281 from dual union all
select 12484936    , 4422911281 from dual union all
select 12651239    , 4422911281 from dual union all
select 12388710    , 4422911281 from dual union all
select 12686953    , 4422911281 from dual union all
select 12365092    , 4423311213 from dual union all
select 12005656    , 4423311213 from dual union all
select 12709544    , 4423311213 from dual union all
select 12484936    , 4423311213 from dual union all
select 12005656    , 4424450542 from dual union all
select 12346839    , 4424450542 from dual union all
select 12365120    , 4424450542 from dual union all
select 12484936    , 4424450542 from dual union all
select 12086512    , 4424450542 from dual
/

Cảnh quay đầu tiên của tôi sẽ là:Đối với mỗi người (otherid) nhận được đầu tiên của mình chỉ số fax và sau đó thực hiện một nhóm bình thường và dựa vào đó:

select first_fax, count(*) firstcount
  from (
   select otherid, min(fax) first_fax
     from nr_pvo_120
    group by otherid
       )
 group by first_fax
 order by first_fax
/

Đầu ra sẽ trở thành:

 FIRST_FAX FIRSTCOUNT
---------- ----------
2762364204          7
4422911281          3
4423311213          1
4424450542          3

Sau đó, tôi nhận thấy đầu ra mong muốn của bạn bao gồm số fax thứ năm nhưng với số lượng bằng không. Ví dụ, điều đó có thể được thực hiện như thế này:

select fax, count(*) normalcount, count(otherid_on_first_fax) countunused
  from (
   select fax, otherid,
          case
             when fax = min(fax) over (partition by otherid order by fax)
             then otherid
          end otherid_on_first_fax
     from nr_pvo_120
       )
 group by fax
 order by fax
/

Trong đầu ra này, cột NORMALCOUNT là số người có bản fax đó. Cột COUNTUNUSED là số người chưa được "sử dụng" trong các lần đếm trước:

       FAX NORMALCOUNT COUNTUNUSED
---------- ----------- -----------
2762364204           7           7
4387267572           2           0
4422911281           6           3
4423311213           4           1
4424450542           5           3

Bí quyết là otherid_on_first_fax chỉ có giá trị là otherid trên số fax đầu tiên của những người, đối với những người còn lại, số fax otherid_on_first_fax là NULL. count(otherid_on_first_fax) sau đó đếm tất cả các giá trị không phải null, trong đó không có giá trị nào dành cho fax 4387267572.



  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 để truy vấn này có thể được cải thiện?

  2. Áp dụng bộ lọc trong Chế độ xem Oracle

  3. Cách chạy Tạo bảng DDL với THỰC HIỆN NGAY LẬP TỨC trong cơ sở dữ liệu Oracle

  4. Làm thế nào để trả về tập kết quả từ thủ tục đã lưu trữ trong Oracle?

  5. Chèn một lượng lớn dữ liệu hiệu quả với SQL