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

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;

经验分享 程序员 微信小程序 职场和发展