MySQL5.7版本没有row_number函数的写法

本文介绍了在MySQL5.7版本中如何通过自定义变量实现类似ROW_NUMBER的功能,以找出诊断名称对应的最常见的MASTER_ID,通过案例和步骤展示了如何统计并获取出现次数最多的记录。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

MySQL5.7版本没有row_number函数的写法


需求:一个诊断名称对应了多个MASTER_ID(诊断编码),取出出现次数最多的那个MASTER_ID(诊断编码)。


学习网址

#1.按照诊断名称分组,过滤出MASTER_ID(诊断编码)大于3次的记录。
SELECT DIAGNOSIS_NAME, COUNT(DISTINCT MASTER_ID)
FROM ICD_10
GROUP BY DIAGNOSIS_NAME
HAVING COUNT(DISTINCT MASTER_ID) > 3;

在这里插入图片描述


#2.查看数据,可以看到1个诊断名称对应了4种MASTER_ID(诊断编码)。
SELECT *
FROM ICD_10
WHERE DIAGNOSIS_NAME = '妊娠合并肠炎'
    AND MASTER_ID REGEXP '[^[:blank:]]';


在这里插入图片描述

#3.按照诊断名称和MASTER_ID(诊断编码)分组统计记录数,按照诊断名称和记录数降序排序。
#注意:子查询里面先把MASTER_ID(诊断编码)为空的记录过滤掉了。
SELECT T1.DIAGNOSIS_NAME, MASTER_ID, COUNT(1) NUM
FROM (
    SELECT MASTER_ID, DIAGNOSIS_NAME
    FROM ICD_10
    WHERE MASTER_ID IS NOT NULL
        AND DIAGNOSIS_NAME = '妊娠合并肠炎'
    ) T1
GROUP BY T1.DIAGNOSIS_NAME, MASTER_ID
ORDER BY DIAGNOSIS_NAME, NUM DESC


在这里插入图片描述

#4.取RN=1的记录,就是取出诊断编码出现最多的那一个。
CREATE TABLE TZ_DIAG_STAND
SELECT *
FROM (
    SELECT @RN: = CASE WHEN @DIAGNOSIS_NAME = DIAGNOSIS_NAME THEN @RN + 1 ELSE 1 END AS RN, 
    @DIAGNOSIS_NAME: = DIAGNOSIS_NAME AS DIAG_NAME, MASTER_ID, NUM
    FROM (
        SELECT T1.DIAGNOSIS_NAME, MASTER_ID, COUNT(1) NUM
        FROM (
            SELECT MASTER_ID, DIAGNOSIS_NAME
            FROM ICD_10
            WHERE MASTER_ID IS NOT NULL
                AND DIAGNOSIS_NAME = '妊娠合并肠炎'
            ) T1
        GROUP BY T1.DIAGNOSIS_NAME, MASTER_ID
        ORDER BY DIAGNOSIS_NAME, NUM DESC
        ) A, (
            SELECT @RN = 0, @DIAGNOSIS_NAME = 0
            ) B
    ) A
WHERE RN = 1;


在这里插入图片描述

#5.MYSQL5.7版本没有ROW_NUMBER函数的写法
CREATE TABLE TZ_DIAG_STAND
SELECT *
FROM (
    SELECT @RN: = CASE WHEN @DIAGNOSIS_NAME = DIAGNOSIS_NAME THEN @RN + 1 ELSE 1 END AS RN, 
    @DIAGNOSIS_NAME: = DIAGNOSIS_NAME AS DIAG_NAME, MASTER_ID, NUM
    FROM (
        SELECT T1.DIAGNOSIS_NAME, MASTER_ID, COUNT(1) NUM
        FROM (
            SELECT MASTER_ID, DIAGNOSIS_NAME
            FROM ICD_10
            WHERE MASTER_ID IS NOT NULL
                AND DIAGNOSIS_NAME = '妊娠合并肠炎'
            ) T1
        GROUP BY T1.DIAGNOSIS_NAME, MASTER_ID
        ORDER BY DIAGNOSIS_NAME, NUM DESC
        ) A, (
            SELECT @RN = 0, @DIAGNOSIS_NAME = 0
            ) B
    ) A
WHERE RN = 1;


在这里插入图片描述

#6.取出每一个诊断,对应出现次数最多的那个MASTER_ID(诊断编码)。
CREATE TABLE TZ_DIAG_STAND
SELECT *
FROM (
    SELECT @RN: = CASE WHEN @DIAGNOSIS_NAME = DIAGNOSIS_NAME THEN @RN + 1 ELSE 1 END AS RN, 
    @DIAGNOSIS_NAME: = DIAGNOSIS_NAME AS DIAG_NAME, MASTER_ID, NUM
    FROM (
        SELECT T1.DIAGNOSIS_NAME, MASTER_ID, COUNT(1) NUM
        FROM (
            SELECT MASTER_ID, DIAGNOSIS_NAME
            FROM ICD_10
            WHERE MASTER_ID IS NOT NULL
            ) T1
        GROUP BY T1.DIAGNOSIS_NAME, MASTER_ID
        ORDER BY DIAGNOSIS_NAME, NUM DESC
        ) A, (
            SELECT @RN = 0, @DIAGNOSIS_NAME = 0
            ) B
    ) A
WHERE RN = 1;

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值