2016-04-26 47 views
0

假設一個表像SQL:瀏覽量超過次數

PROD |SIZE|.. 
-------|----|-- 
ProdA |150 |.. 
ProdA |200 |.. 
ProdA |200 |.. 
ProdA |200 |.. 
ProdB |150 |.. 
ProdB |150 |.. 
ProdB |150 |.. 
ProdC |200 |.. 
.... |... |.. 

我需要一個查詢,以匹配每個產品最多發生的歷史大小,從而導致:

PROD |SIZE|.. 
-------|----|-- 
ProdA |200 |.. 
ProdB |150 |.. 

我想我必須使用一個複雜的rank() over(partition)其中有一些count()構建,但不知何故我無法弄清楚。

我被困在

SELECT 
    PROD 
, SIZE 
FROM (
    SELECT 
    PROD 
    , SIZE 
    , RANK() OVER (PARTITION BY PROD ORDER BY COUNT(SIZE)) AS RANK 
) 
WHERE 
    RANK = 1 

編輯:增加了一個列例子來闡明有更多的數據..

+0

你準確地粘在哪裏?我想,你收到了一條你沒有告訴我們的錯誤信息?我們爲什麼猜測?你忘了FROM和GROUP BY子句,也許你不應該使用RANK作爲別名。然後你忘了訂購*降序*。除此之外,你的查詢看起來很好。 –

回答

0

Oracle功能,返回最頻繁的值函數STATS_MODE

select prod, stats_mode(size) 
from mytable 
group by prod; 

如果有關係(即兩個或多個大小共享最高頻率),您會得到一個仲裁rarily。

這裏是RANK查詢即使對於關係也適用。我們使用RANK來按照頻率對每個產品的彙總記錄(即產品尺寸)進行排名,並且只保留那些排名最佳的尺寸(排名#1)。

select prod, size 
from 
(
    select 
    prod, 
    size, 
    rank() over (partition by prod order by count(*) desc) as rnk 
    from mytable 
    group by prod, size 
) 
where rnk = 1; 
+0

感謝您的回答。唯一的情況是在配合的情況下會出錯。我們應該使用DENSE_RANK()來取得準確的排名,而不是RANK()。 –

+0

@Avrajit Roy:不管你是否使用'RANK'或'DENSE_RANK',排名#1都會被賦予相同的行。 –

+0

Yeaah true。我期待如果用戶要求更多的排名其他第一個:) –

0

你也可以試試這個。希望能幫助到你。

SELECT C.* 
FROM 
    (SELECT B.*, 
    ROW_NUMBER() OVER(PARTITION BY B.CD ORDER BY B.RN DESC) RNK 
    FROM 
    (SELECT A.*, 
     COUNT(A.QT) OVER(PARTITION BY A.CD,A.QT ORDER BY A.CD DESC) RN 
    FROM 
     (SELECT 1 AS CD, 200 QT FROM DUAL 
     UNION ALL 
     SELECT 1 AS CD, 200 QT FROM DUAL 
     UNION ALL 
     SELECT 1 AS CD, 200 QT FROM DUAL 
     UNION ALL 
     SELECT 1 AS CD, 150 QT FROM DUAL 
     UNION ALL 
     SELECT 2 AS CD, 100 QT FROM DUAL 
     UNION ALL 
     SELECT 2 AS CD, 150 QT FROM DUAL 
     UNION ALL 
     SELECT 2 AS CD, 100 QT FROM DUAL 
     UNION ALL 
     SELECT 2 AS CD, 500 QT FROM DUAL 
     UNION ALL 
     SELECT 1 AS CD, 100 QT FROM DUAL 
    )A 
    ) B 
)C 
WHERE C.RNK = 1 ;