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/