亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

MySQL中的排名功能

MySQL中的排名功能

夢里花落0921 2019-05-27 16:18:06
MySQL中的排名功能我需要找出客戶的排名。在這里,我為我的要求添加了相應的ANSI標準SQL查詢。請幫我轉換為MySQL。SELECT RANK() OVER (PARTITION BY Gender ORDER BY Age) AS [Partition by Gender],    FirstName,    Age,   Gender  FROM Person有沒有找到MySQL排名的函數?
查看完整描述

3 回答

?
BIG陽

TA貢獻1859條經驗 獲得超6個贊

一種選擇是使用排名變量,例如:


SELECT    first_name,

          age,

          gender,

          @curRank := @curRank + 1 AS rank

FROM      person p, (SELECT @curRank := 0) r

ORDER BY  age;

該(SELECT @curRank := 0)部分允許變量初始化而無需單獨的SET命令。


測試用例:


CREATE TABLE person (id int, first_name varchar(20), age int, gender char(1));


INSERT INTO person VALUES (1, 'Bob', 25, 'M');

INSERT INTO person VALUES (2, 'Jane', 20, 'F');

INSERT INTO person VALUES (3, 'Jack', 30, 'M');

INSERT INTO person VALUES (4, 'Bill', 32, 'M');

INSERT INTO person VALUES (5, 'Nick', 22, 'M');

INSERT INTO person VALUES (6, 'Kathy', 18, 'F');

INSERT INTO person VALUES (7, 'Steve', 36, 'M');

INSERT INTO person VALUES (8, 'Anne', 25, 'F');

結果:


+------------+------+--------+------+

| first_name | age  | gender | rank |

+------------+------+--------+------+

| Kathy      |   18 | F      |    1 |

| Jane       |   20 | F      |    2 |

| Nick       |   22 | M      |    3 |

| Bob        |   25 | M      |    4 |

| Anne       |   25 | F      |    5 |

| Jack       |   30 | M      |    6 |

| Bill       |   32 | M      |    7 |

| Steve      |   36 | M      |    8 |

+------------+------+--------+------+

8 rows in set (0.02 sec)


查看完整回答
反對 回復 2019-05-27
?
素胚勾勒不出你

TA貢獻1827條經驗 獲得超9個贊


這是一個通用的解決方案,它將分區上的密集排名分配給行。它使用用戶變量:


CREATE TABLE person (

    id INT NOT NULL PRIMARY KEY,

    firstname VARCHAR(10),

    gender VARCHAR(1),

    age INT

);


INSERT INTO person (id, firstname, gender, age) VALUES

(1,  'Adams',  'M', 33),

(2,  'Matt',   'M', 31),

(3,  'Grace',  'F', 25),

(4,  'Harry',  'M', 20),

(5,  'Scott',  'M', 30),

(6,  'Sarah',  'F', 30),

(7,  'Tony',   'M', 30),

(8,  'Lucy',   'F', 27),

(9,  'Zoe',    'F', 30),

(10, 'Megan',  'F', 26),

(11, 'Emily',  'F', 20),

(12, 'Peter',  'M', 20),

(13, 'John',   'M', 21),

(14, 'Kate',   'F', 35),

(15, 'James',  'M', 32),

(16, 'Cole',   'M', 25),

(17, 'Dennis', 'M', 27),

(18, 'Smith',  'M', 35),

(19, 'Zack',   'M', 35),

(20, 'Jill',   'F', 25);


SELECT person.*, @rank := CASE

    WHEN @partval = gender AND @rankval = age THEN @rank

    WHEN @partval = gender AND (@rankval := age) IS NOT NULL THEN @rank + 1

    WHEN (@partval := gender) IS NOT NULL AND (@rankval := age) IS NOT NULL THEN 1

END AS rnk

FROM person, (SELECT @rank := NULL, @partval := NULL, @rankval := NULL) AS x

ORDER BY gender, age;

請注意,變量賦值放在CASE表達式中。這(理論上)負責評估問題的順序。將IS NOT NULL被添加到處理數據類型轉換和短路的問題。


PS:通過刪除檢查綁定的所有條件,可以輕松地將其轉換為分區上的行號。


| id | firstname | gender | age | rank |

|----|-----------|--------|-----|------|

| 11 | Emily     | F      | 20  | 1    |

| 20 | Jill      | F      | 25  | 2    |

| 3  | Grace     | F      | 25  | 2    |

| 10 | Megan     | F      | 26  | 3    |

| 8  | Lucy      | F      | 27  | 4    |

| 6  | Sarah     | F      | 30  | 5    |

| 9  | Zoe       | F      | 30  | 5    |

| 14 | Kate      | F      | 35  | 6    |

| 4  | Harry     | M      | 20  | 1    |

| 12 | Peter     | M      | 20  | 1    |

| 13 | John      | M      | 21  | 2    |

| 16 | Cole      | M      | 25  | 3    |

| 17 | Dennis    | M      | 27  | 4    |

| 7  | Tony      | M      | 30  | 5    |

| 5  | Scott     | M      | 30  | 5    |

| 2  | Matt      | M      | 31  | 6    |

| 15 | James     | M      | 32  | 7    |

| 1  | Adams     | M      | 33  | 8    |

| 18 | Smith     | M      | 35  | 9    |

| 19 | Zack      | M      | 35  | 9    |

演示db <>小提琴


查看完整回答
反對 回復 2019-05-27
?
料青山看我應如是

TA貢獻1772條經驗 獲得超8個贊

雖然最受歡迎的答案排名,但它沒有分區,你可以自己加入以獲得整個分區的東西:


SELECT    a.first_name,

      a.age,

      a.gender,

        count(b.age)+1 as rank

FROM  person a left join person b on a.age>b.age and a.gender=b.gender 

group by  a.first_name,

      a.age,

      a.gender

用例


CREATE TABLE person (id int, first_name varchar(20), age int, gender char(1));


INSERT INTO person VALUES (1, 'Bob', 25, 'M');

INSERT INTO person VALUES (2, 'Jane', 20, 'F');

INSERT INTO person VALUES (3, 'Jack', 30, 'M');

INSERT INTO person VALUES (4, 'Bill', 32, 'M');

INSERT INTO person VALUES (5, 'Nick', 22, 'M');

INSERT INTO person VALUES (6, 'Kathy', 18, 'F');

INSERT INTO person VALUES (7, 'Steve', 36, 'M');

INSERT INTO person VALUES (8, 'Anne', 25, 'F');

答案:


Bill    32  M   4

Bob     25  M   2

Jack    30  M   3

Nick    22  M   1

Steve   36  M   5

Anne    25  F   3

Jane    20  F   2

Kathy   18  F   1


查看完整回答
反對 回復 2019-05-27
  • 3 回答
  • 0 關注
  • 1318 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號