2013-11-25 45 views
0

我用下面的語句創建了一個視圖。在項目數量排名中,MYSQL

CREATE VIEW 
view_projectHour 
AS 
SELECT pno 
, SUM(hours) AS total_hours 
FROM works_on 
GROUP BY pno 
ORDER BY total_hours DESC 

現在,我該如何在這個視圖中實現排名?我想要項目排名。最高時間的項目必須排在第一位,並置於頂部等。也有相同的小時項目。

+0

換言之,可能存在關係,但關係應如何排名?也就是說,如果雙方並列第一名,那麼排名第一和第二名都是第三名? –

+0

是的,那很好。要麼是這個,要麼就是#1和下一個#2。 – Modaresi

+0

我認爲你可以通過@Salman在另一個主題中發佈的解決方案來解決這個問題:http://stackoverflow.com/a/14297055/780592 – Akatum

回答

1

另一種解決方案是使用一個JOIN計數多少個值的每一行均排好;

SELECT 1+COUNT(b.total_hours) rank, a.pno, a.total_hours 
FROM test a 
LEFT JOIN test b 
    ON a.total_hours < b.total_hours 
GROUP BY a.pno, a.total_hours 
ORDER BY total_hours DESC; 

An SQLfiddle to test with

+0

太棒了,這個工作得很好。我很感激。 – Modaresi

2

不幸的是,MySQL缺少對分析功能的支持。特別是RANK()RANK_DENSE()

爲了模擬RANK()你可以做

SELECT pno, total_hours, rank 
    FROM 
( 
    SELECT pno, total_hours, 
     @n := @n + 1 rnum, @r := IF(@h = total_hours, @r, @n) rank, @h := total_hours 
    FROM 
    (
    SELECT pno, SUM(hours) total_hours 
     FROM works_on 
    GROUP BY pno 
) q CROSS JOIN (SELECT @n := 0, @r := 0, @h := NULL) i 
    ORDER BY total_hours DESC, pno 
) t 

輸出示例:

 
| PNO | TOTAL_HOURS | RANK | 
|-----|-------------|------| 
| 3 |   61 | 1 | 
| 1 |   40 | 2 | 
| 2 |   40 | 2 | 
| 4 |   10 | 4 | 

爲了模擬DENSE_RANK()你可以做

SELECT pno, total_hours, rank 
    FROM 
(
    SELECT pno, total_hours, 
     @r := IF(@h = total_hours, @r, @r + 1) rank, @h := total_hours 
    FROM 
    (
    SELECT pno, SUM(hours) total_hours 
     FROM works_on 
    GROUP BY pno 
) q CROSS JOIN (SELECT @r := 0, @h := NULL) i 
    ORDER BY total_hours DESC, pno 
) t 

輸出示例:

 
| PNO | TOTAL_HOURS | RANK | 
|-----|-------------|------| 
| 3 |   61 | 1 | 
| 1 |   40 | 2 | 
| 2 |   40 | 2 | 
| 4 |   10 | 3 | 

注:您可以溝外SELECT■如果你不介意在你的結果集的一個或兩個額外列。

這裏是SQLFiddle演示

+0

以前看的是同樣的東西,在MySQL文檔中發現了這個; [作爲一般規則,除了在SET語句中,您不應該爲用戶變量賦值並在相同的語句中讀取該值。 ...對於其他語句,如SELECT,您可能會得到您期望的結果,但不能保證。 ...涉及用戶變量的表達式的評估順序未定義。](http://dev.mysql.com/doc/refman/5.0/en/user-variables.html) –

+0

@JoachimIsaksson是的我知道,它就像使用MySQL'GROUP BY'擴展名:沒有保證,但按預期工作。它可以是或者使用'COUNT()'來模擬等級函數或者在客戶端執行。無論如何**感謝您的輸入。我同意至少OP應該知道它。 – peterm

+0

它排序正確,但對於列列它將輸出「[BLOB - 1B」,這是MySQL的錯誤返回一個空的結果集。 – Modaresi