嗨,我是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/

10-11 03:20
查看更多