牛客 妙解 不同岗位中位数位置的所有grade信息

1. 数据结构

-- 数据结构
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for grade
-- ----------------------------
DROP TABLE IF EXISTS `grade`;
CREATE TABLE `grade`  (
  `id` int NOT NULL,
  `job` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
  `score` int NOT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of grade
-- ----------------------------
INSERT INTO `grade` VALUES (1, 'C++', 11001);
INSERT INTO `grade` VALUES (2, 'C++', 10000);
INSERT INTO `grade` VALUES (3, 'C++', 9000);
INSERT INTO `grade` VALUES (4, 'Java', 12000);
INSERT INTO `grade` VALUES (5, 'Java', 13000);
INSERT INTO `grade` VALUES (6, 'B', 12000);
INSERT INTO `grade` VALUES (7, 'B', 11000);
INSERT INTO `grade` VALUES (8, 'B', 9999);

SET FOREIGN_KEY_CHECKS = 1;
View Code

2.实现SQL(他人写法,思路新奇,值得记录)

 1 -- abs( t1.s_rank -( t1.num + 1 )/ 2 )< 1  中位数的位置
 2 -- 窗口函数应用
 3 SELECT
 4     id,
 5     job,
 6     score,
 7     s_rank 
 8 FROM
 9     (
10     SELECT
11         *,(
12             row_number() over ( PARTITION BY job ORDER BY score DESC )) AS s_rank,(
13         count( score ) over ( PARTITION BY job )) AS num 
14     FROM
15         grade 
16     ) t1 
17 WHERE
18     abs( t1.s_rank -( t1.num + 1 )/ 2 )< 1 
19 ORDER BY
20     id;

 

posted @ 2021-04-05 14:22  VVII  阅读(69)  评论(0)    收藏  举报