2016-07-22 51 views
0

,所以我有這樣的表中的數據排名:的mysql進行分組與領帶

id  total group_id 
1897  738  1 
2489  716  2 
2325  715  3 
1788  702  2 
1707  699  3 
2400  688  3 
2668  682  2 
1373  666  1 
1494  666  1 
1564  660  1 
2699  659  1 
1307  648  4 
1720  645  4 
2176  644  1 
1454  644  4 
2385  639  3 
1001  634  2 
2099  634  4 
1006  632  1 
2587  630  3 
1955  624  3 
1827  624  4 
2505  623  4 
2062  621  3 
1003  618  1 
2286  615  4 
2722  609  4 

我怎麼可以排名每組的IDS基於總,並給予同級別的時候有一搭?

我曾嘗試下面這種解決方案,但它不走關係的照顧。

SELECT g1.admission_no 
, g1.total 
, g1.stream_id 
, COUNT(*) AS rn 
FROM ranktest AS g1 
    JOIN ranktest AS g2 
    ON (g2.total, g2.admission_no) >= (g1.total, g1.admission_no) 
    AND g1.stream_id = g2.stream_id 
    GROUP BY g1.admission_no 
    , g1.stream_id 
    , g1.total 
    ORDER BY g1.stream_id 
    , total ; 

預計

id  total group_id rank 
1897  738  1  1 
2489  716  2  1 
2325  715  3  1 
1788  702  2  2 
1707  699  3  2 
2400  688  3  3 
2668  682  2  3 
1373  666  1  2 
1494  666  1  2 
1564  660  1  3 
2699  659  1  4 
1307  648  4  1 
1720  645  4  2 
2176  644  1  4 
1454  644  4  3 
2385  639  3  4 
1001  634  2  4 
2099  634  4  4 
1006  632  1  5 
2587  630  3  5 
1955  624  3  6 
1827  624  4  5 
2505  623  4  6 
2062  621  3  6 
1003  618  1  6 
2286  615  4  7 
2722  609  4  8 
+0

[選擇](http://dev.mysql.com/doc/refman/5.7/en/select.html)+ [聚集體](http://dev.mysql.com/doc/refman/5.7/en/group-by-functions.html)。我們不會爲你寫代碼。你寫代碼,我們(也許)試着修復它。 –

+0

@MarcB我有這段代碼使用連接,但ID沒有照顧的關係,我不知道如何解決它 – GOA

+0

所以顯示此代碼。但是如果你想要關係,你需要額外的查詢腳手架來檢測關係並且拉出產生這些關係的記錄。 –

回答

0

確保谷歌上搜索一個bit..not後,想出了這個答案是其最好的,但它適合我的情況:

SELECT id, group_id, total, 
    @std:=CASE WHEN @grp <> group_id THEN concat(left(@grp:=group_id, 0), 1) ELSE if(@prev=total,@std,@std+1) END AS rn,@prev:=total 
FROM 
    (SELECT @std:= -1) s, 
(SELECT @grp:= -1,@prev:=null) c, 
(SELECT * 
    FROM table 
    ORDER BY group_id, total desc 
) s 
2

如果原來的順序是不是很重要你可以從這裏開始:

http://sqlfiddle.com/#!9/a15a2/10

SELECT 
    ranktest.*, 
    IF(@rank IS NULL,@rank:=1, IF(@prev!=group_id,@rank:=1,@rank:[email protected]+1)) rank, 
    @prev:=group_id 
FROM ranktest 
ORDER BY group_id, total 

但請記住,這是不是從性能的角度來看非常高效的查詢。

1

從有權User-Defined Variables MySQL手冊頁:

在下面的語句,你 可能會認爲MySQL將評估@a第一,然後做一個 分配第二:

SELECT @a, @a:[email protected]+1, ...; 

然而,涉及用戶 變量的表達式的評估順序未定義。

這就是爲什麼這麼幾個人正確,安全地寫這些的答案。目標不是一次達到預期的結果,而是要在實際環境中一次又一次地使用最佳實踐和保證結果。

如果你不讀Obligatory Doc,並執行它,你的結果不能保證。有沒有偷懶的辦法來做到這一點,一個不應該甚至懶得:對

select id,total,group_id,rank 
from 
( select id,total,group_id, 
    @rn:=if( [email protected]_grp, greatest(@grp_rank:=1,0), 
     if([email protected]_grp_total,@grp_rank,greatest(@grp_rank:[email protected]_rank+1,0))) as rank, 
    @curr_grp:=group_id, 
    @prev_grp_total:=total 
    from trans01 
    cross join (select @grp_rank:=0,@curr_grp:=0,@prev_grp_total:=-1) xParams 
    order by group_id,total desc 
)xDerived; 

+------+-------+----------+------+ 
| id | total | group_id | rank | 
+------+-------+----------+------+ 
| 1897 | 738 |  1 | 1 | 
| 1373 | 666 |  1 | 2 | 
| 1494 | 666 |  1 | 2 | 
| 1564 | 660 |  1 | 3 | 
| 2699 | 659 |  1 | 4 | 
| 2176 | 644 |  1 | 5 | 
| 1006 | 632 |  1 | 6 | 
| 1003 | 618 |  1 | 7 | 

| 2489 | 716 |  2 | 1 | 
| 1788 | 702 |  2 | 2 | 
| 2668 | 682 |  2 | 3 | 
| 1001 | 634 |  2 | 4 | 

| 2325 | 715 |  3 | 1 | 
| 1707 | 699 |  3 | 2 | 
| 2400 | 688 |  3 | 3 | 
| 2385 | 639 |  3 | 4 | 
| 2587 | 630 |  3 | 5 | 
| 1955 | 624 |  3 | 6 | 
| 2062 | 621 |  3 | 7 | 

| 1307 | 648 |  4 | 1 | 
| 1720 | 645 |  4 | 2 | 
| 1454 | 644 |  4 | 3 | 
| 2099 | 634 |  4 | 4 | 
| 1827 | 624 |  4 | 5 | 
| 2505 | 623 |  4 | 6 | 
| 2286 | 615 |  4 | 7 | 
| 2722 | 609 |  4 | 8 | 
+------+-------+----------+------+ 
+0

我會再次敏銳地讀到它。 – GOA

+0

訣竅在於將var嵌入到'least()','most()'或'coalesce()'中。它可能看起來很荒謬,說,給我最大的9或0,但有一種方法來瘋狂。 – Drew

+0

它也可以工作 – GOA