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

Nhận 10 sản phẩm hàng đầu cho mọi danh mục

Có thể có những lý do để không sử dụng các chức năng phân tích mà chỉ sử dụng các chức năng phân tích một mình :

select am, rf, rfm, rownum_rf2, rownum_rfm
from
(
    -- the 3nd level takes the subproduct ranks, and for each equally ranked
    -- subproduct, it produces the product ranking
    select am, rf, rfm, rownum_rfm,
      row_number() over (partition by rownum_rfm order by rownum_rf) rownum_rf2
    from
    (
        -- the 2nd level ranks (without ties) the products within
        -- categories, and subproducts within products simultaneosly
        select am, rf, rfm,
          row_number() over (partition by am order by count_rf desc) rownum_rf,
          row_number() over (partition by am, rf order by count_rfm desc) rownum_rfm
        from
        (
            -- inner most query counts the records by subproduct
            -- using regular group-by. at the same time, it uses
            -- the analytical sum() over to get the counts by product
            select tg.am, ttc.rf, ttc.rfm,
              count(*) count_rfm,
              sum(count(*)) over (partition by tg.am, ttc.rf) count_rf
            from tg inner join ttc on tg.value = ttc.value
            group by tg.am, ttc.rf, ttc.rfm
        ) X
    ) Y
    -- at level 3, we drop all but the top 5 subproducts per product
    where rownum_rfm <= 5   -- top  5 subproducts
) Z
-- the filter on the final query retains only the top 10 products
where rownum_rf2 <= 10  -- top 10 products
order by am, rownum_rf2, rownum_rfm;

Tôi đã sử dụng rownum thay vì xếp hạng để bạn không bao giờ nhận được mối quan hệ, hay nói cách khác, mối quan hệ sẽ được quyết định một cách ngẫu nhiên. Điều này cũng không hoạt động nếu dữ liệu không đủ dày đặc (ít hơn 5 sản phẩm con trong bất kỳ sản phẩm nào trong số 10 sản phẩm hàng đầu - thay vào đó, nó có thể hiển thị các sản phẩm con từ một số sản phẩm khác). Nhưng nếu dữ liệu dày đặc (cơ sở dữ liệu lớn được thiết lập), truy vấn sẽ hoạt động tốt.

Phần dưới đây thực hiện hai lần chuyển dữ liệu, nhưng trả về kết quả chính xác trong mỗi trường hợp. Một lần nữa, đây là truy vấn không có mối quan hệ xếp hạng.
select am, rf, rfm, count_rf, count_rfm, rownum_rf, rownum_rfm
from
(
    -- next join the top 10 products to the data again to get
    -- the subproduct counts
    select tg.am, tg.rf, ttc.rfm, tg.count_rf, tg.rownum_rf, count(*) count_rfm,
        ROW_NUMBER() over (partition by tg.am, tg.rf order by 1 desc) rownum_rfm
    from (
        -- first rank all the products
        select tg.am, tg.value, ttc.rf, count(*) count_rf,
            ROW_NUMBER() over (order by 1 desc) rownum_rf
        from tg
        inner join ttc on tg.value = ttc.value
        group by tg.am, tg.value, ttc.rf
        order by count_rf desc
        ) tg
    inner join ttc on tg.value = ttc.value and tg.rf = ttc.rf
    -- filter the inner query for the top 10 products only
    where rownum_rf <= 10
    group by tg.am, tg.rf, ttc.rfm, tg.count_rf, tg.rownum_rf
) X
-- filter where the subproduct rank is in top 5
where rownum_rfm <= 5
order by am, rownum_rf, rownum_rfm;

cột:

count_rf : count of sales by product
count_rfm : count of sales by subproduct
rownum_rf : product rank within category (rownumber - without ties)
rownum_rfm : subproduct rank within product (without ties)


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tạo công việc DBMS_SCHEDULER cho oracle

  2. Tìm ngày giữa hai ngày (Phương pháp hay nhất)

  3. Làm cách nào để đặt phiên bản SDE trong nguồn luồng dữ liệu SSIS

  4. Nhận số lượng tất cả các bảng trong một giản đồ

  5. Thay đổi kiểu dữ liệu của một cột, được tham chiếu bởi các bảng khác