4 回答

TA貢獻1775條經驗 獲得超8個贊
我總是最終遵循這種模式。鑒于此表:
+------+------+
| i | j |
+------+------+
| 1 | 11 |
| 1 | 12 |
| 1 | 13 |
| 2 | 21 |
| 2 | 22 |
| 2 | 23 |
| 3 | 31 |
| 3 | 32 |
| 3 | 33 |
| 4 | 14 |
+------+------+
你可以得到這個結果:
+------+------+------------+
| i | j | row_number |
+------+------+------------+
| 1 | 11 | 1 |
| 1 | 12 | 2 |
| 1 | 13 | 3 |
| 2 | 21 | 1 |
| 2 | 22 | 2 |
| 2 | 23 | 3 |
| 3 | 31 | 1 |
| 3 | 32 | 2 |
| 3 | 33 | 3 |
| 4 | 14 | 1 |
+------+------+------------+
通過運行此查詢,不需要定義任何變量:
SELECT a.i, a.j, count(*) as row_number FROM test a
JOIN test b ON a.i = b.i AND a.j >= b.j
GROUP BY a.i, a.j

TA貢獻1772條經驗 獲得超6個贊
我希望每個(col1,col2)對的行具有單個最高col3。
這是一個分組最大值,是最常見的SQL問題之一(因為它看起來應該很簡單,但實際上并非如此)。
我常常喜歡null-self-join:
SELECT t0.col3FROM table AS t0LEFT JOIN table AS t1 ON t0.col1=t1.col1 AND t0.col2=t1.col2 AND t1.col3>t0.col3WHERE t1.col1 IS NULL;
“獲取表格中沒有其他行匹配col1的行,col2具有更高的col3。”(您會注意到這一點,如果多行具有相同的col1,則大多數其他groupwise-maximum解決方案將返回多行,col2 ,col3。如果這是一個問題,你可能需要一些后期處理。)

TA貢獻1921條經驗 獲得超9個贊
MySQL中沒有排名功能。你可以得到的最接近的是使用一個變量:
SELECT t.*, @rownum := @rownum + 1 AS rank FROM YOUR_TABLE t, (SELECT @rownum := 0) r
那么在我的案例中如何運作呢?我需要兩個變量,col1和col2各有一個?當col1改變時,Col2需要以某種方式重置..?
是。如果是Oracle,則可以使用LEAD函數在下一個值處達到峰值。值得慶幸的是,Quassnoi涵蓋了您需要在MySQL中實現的邏輯。
添加回答
舉報