简体   繁体   English

MySQL中等级和密集等级的实现

[英]Implementation of Rank and Dense Rank in MySQL

Hi I am a Begineer in MySql and I want to Implement Rank and Dense Rank Function on MySql for the given problem statement stated below. 嗨,我是MySql的初学者,我想针对以下给定的问题陈述在MySql上实现排名和密集排名功能。

I have a Table called Transaction which has following Columns: 我有一个名为Transaction的表,该表具有以下列:

 Transaction_no | Register|Adult|child 

The Input Data is as follows: 输入数据如下:
INPUT 输入

+----------------+----------+-------+-------+----+
| 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 |
+----------------+----------+-------+-------+----+

My Requirement is to add another column namely rn using mySQL which will use Rank and dense rank like logic to generate the following intermediate output 我的要求是使用mySQL添加另一列即rn ,它将使用Rank和密集排名之类的逻辑来生成以下中间输出

INTERMEDIATE 中间

+----------------+----------+-------+-------+
| transaction_no | register | adult | child |
+----------------+----------+-------+-------+
|           1234 |        A |     0 |     1 |
|           3456 |        B |     1 |     0 |
|           5678 |        B |     1 |     0 |
|           2468 |        C |     1 |     0 |
+----------------+----------+-------+-------+

Here the partition is done on transaction number. 在这里,分区是根据交易号完成的。

The Final Query Output should contain all the rows whose rn =1 and the rn value should not displayed. 最终查询输出应包含rn = 1且不显示rn值的所有行。
OUTPUT 输出值

 +----------------+----------+-------+-------+ | transaction_no | register | adult | child | +----------------+----------+-------+-------+ | 1234 | A | 0 | 1 | | 3456 | B | 1 | 0 | | 5678 | B | 1 | 0 | | 2468 | C | 1 | 0 | +----------------+----------+-------+-------+ 

Oracle Documentation for Reference : OracleDocument Oracle参考文件: OracleDocument

I have also added SQL fiddle for Reference. 我还添加了SQL提琴供参考。 SqlFiddle SqlFiddle

Please help me on this. 请帮我。

declare @t table (TransactionId int,register VARCHAR(1),Adult INT,Child INT )
insert into @t (TransactionId,register,Adult,Child)values (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)
;with cte as (
select TransactionId,register,Adult,Child,ROW_NUMBER()OVER(PARTITION BY TransactionId,register  ORDER BY register ) RN from @t
)
Select TransactionId,register,Adult,Child from cte where RN = 1

MySQL Solution : 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

Note : Desired ordering can only be achieved on explicit request, hence ORDER BY is used in the query. 注意 :只能在显式请求上实现期望的排序,因此在查询中使用ORDER BY

create table TRANSACTION ( Transaction_no int, Register varchar2(2), Adult int, child int ); 创建表TRANSACTION(Transaction_no int,Register varchar2(2),Adult int,child int);

Insert rows in TRANSACTION table. 在TRANSACTION表中插入行。

Sqlquery for Intermediate output:- 中间输出的sqlquery:-

select TRANSACTION_NO,REGISTER,Adult,child, DENSE_RANK() over(PARTITION BY REGISTER ORDER BY Adult,child) as rnk from TRANSACTION; 从TRANSACTION中选择TRANSACTION_NO,REGISTER,Adult,child,DENSE_RANK()over(PARTITION BY REGISTER ORDER BY Adult,child)作为rnk;

Sqlquery for Final output:- 最终输出的sqlquery:-

select TRANSACTION_NO,REGISTER,Adult,child from ( select TRANSACTION_NO,REGISTER,Adult,child, DENSE_RANK() over(PARTITION BY TRANSACTION_NO ORDER BY Adult,child) as rnk from TRANSACTION) where rnk=1; 从TRANSACTION中选择TRANSACTION_NO,REGISTER,Adult,child(从TRANSACTION中选择TRANSACTION_NO,REGISTER,Adult,child,DENSE_RANK()超过(PARTITION BY TRANSACTION_NO ORDER BY Adult,child)作为rnk),其中rnk = 1;

I tried it on Oracle. 我在Oracle上尝试过。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM