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;