mysql - MySQL中Rank和DenseRank的实现

标签 mysql sql-server oracle

您好,我是 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 ,它将使用排名和密集排名逻辑来生成以下中间输出

中级

+----------------+----------+-------+-------+----+
| 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 fiddle 供引用。 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和DenseRank的实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30725574/

相关文章:

mysql - 操作DataGridView

sql-server - cakephp 2.0.5 Sqlserver 需要数据库连接

sql - 计算有多少列具有特定值

sql-server - SQL Server - 选择有条件的最新记录

php - 名为change的列出现奇怪的MySQL行为

MySQL - 引用上一行以添加计算列

php - 使用 Laravel 查询生成器和 LEFT JOIN 删除行

java - 使用带有 boolean IN 参数的 CallableStatement 在 Java 中调用 Oracle PL/SQL 过程会产生 PLS-00306 oracle 错误 :

oracle - SqlLoader 中的提交点​​,使用的行不起作用

mysql - 什么命令可以查看表之间的关系?