嗨,我是MySql的初学者,我想针对以下给定的问题陈述在MySql上实现排名和密集排名功能。
我有一个名为Transaction
的表,该表具有以下列:
Transaction_no | Register|Adult|child
输入数据如下:
输入
+----------------+----------+-------+-------+
| transaction_no | register | adult | child |
+----------------+----------+-------+-------+
| 1234 | A | 0 | 1 |
| 1234 | A | 1 | 2 |
| 1234 | A | 1 | 1 |
| 3456 | B | 1 | 0 |
| 5678 | B | 1 | 0 |
| 2468 | C | 1 | 0 |
| 2468 | C | 0 | 1 |
+----------------+----------+-------+-------+
我的要求是使用mySQL添加另一列rn,它将使用Rank和密集排名之类的逻辑来生成以下中间输出
中间
+----------------+----------+-------+-------+----+
| transaction_no | register | adult | child | rn |
+----------------+----------+-------+-------+----+
| 1234 | A | 0 | 1 | 1 |
| 1234 | A | 1 | 2 | 2 |
| 1234 | A | 1 | 1 | 3 |
| 3456 | B | 1 | 0 | 1 |
| 5678 | B | 1 | 0 | 1 |
| 2468 | C | 1 | 0 | 1 |
| 2468 | C | 0 | 1 | 2 |
+----------------+----------+-------+-------+----+
在这里,分区是根据交易号完成的。
最终查询输出应包含rn = 1且不显示rn值的所有行。
输出值
+----------------+----------+-------+-------+
| transaction_no | register | adult | child |
+----------------+----------+-------+-------+
| 1234 | A | 0 | 1 |
| 3456 | B | 1 | 0 |
| 5678 | B | 1 | 0 |
| 2468 | C | 1 | 0 |
+----------------+----------+-------+-------+
Oracle参考文件:OracleDocument
我还添加了SQL提琴供参考。SqlFiddle
请帮我。
最佳答案
MySQL解决方案:
SELECT transaction_no, register, adult, child
FROM (
SELECT
( CASE WHEN @prev_tno != transaction_no THEN @rn:=1
ELSE @rn:=(@rn+1) END ) AS rn
, @prev_tno:=transaction_no AS transaction_no
, register, adult, child
FROM instructor
, (SELECT @rn:=0, @prev_tno:=NULL) AS row_nums
) src
WHERE rn = 1
ORDER BY register, transaction_no
注意:只能在显式请求上实现期望的排序,因此在查询中使用
ORDER BY
。关于mysql - MySQL中Rank和Dense_rank的实现,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30725574/