[英]Implementation of Rank and Dense Rank in MySQL
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
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.