MySQL 은 row 를 어떻게 실현 합 니까?number()및 rownumber over(partition by column)

2402 단어 MySQL
MySQL 사용 rownumber()및 rownumber over(partition by column)
Oacle 에서 일부 데 이 터 를 처리 할 때 row 를 사용 합 니 다.number()over(partition by a order by b desc)함수 가 상당히 편리 합 니 다.안 타 깝 게 도 이렇게 손 쉬 운 도 구 는 MySQL 에 없습니다.쓰 려 면 알 아서 해 야 지.
우선 rownumber()
먼저 시 계 를 만들다.
DROP TABLE IF EXISTS `employee`;
CREATE TABLE `employee`  (
  `record_id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '  id',
  `employee_id` int(10) NULL DEFAULT NULL COMMENT '    ',
  `employee_name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '    ',
  `group_no` int(10) NULL DEFAULT NULL COMMENT '      ',
  `salary` decimal(10, 2) NULL DEFAULT NULL COMMENT '  ',
  PRIMARY KEY (`record_id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 13 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Compact;

-- ----------------------------
-- Records of employee
-- ----------------------------
INSERT INTO `employee` VALUES (1, 1, '  ', 1, 1000.00);
INSERT INTO `employee` VALUES (3, 2, '  ', 1, 2000.00);
INSERT INTO `employee` VALUES (5, 3, '  ', 2, 2001.00);
INSERT INTO `employee` VALUES (7, 4, '  ', 2, 1996.00);
INSERT INTO `employee` VALUES (9, 5, '  ', 3, 1998.00);
INSERT INTO `employee` VALUES (11, 6, '  ', 4, 2005.00);

위의 시 계 를 둘러싸 고 쓰 세 요.우 리 는 데 이 터 를 조회 한 후에 정렬 을 추가 하 기 를 희망 한다.그럼 우 리 는 아래 에 이렇게 쓰 면 돼.
select x.*,(@r:=@r+1) as rank  from (
select e.record_id,e.employee_id,e.employee_name,e.group_no,e.salary
from employee e 
order by e.salary desc) x,(select @r:=0) r 

rank 은 우리 가 조회 한 결과 의 정렬 값 입 니 다.
다음:rownumber(@partition by column)
여기 에는 그룹 만 있 기 때문에 우 리 는 먼저 데 이 터 를 정렬 해 야 한다.만약 에 우리 가 직원 을 부서 에 따라 그룹 을 나 누 려 면 임금 이 많 고 적 게 줄 여야 한다.우 리 는 먼저 데 이 터 를 처리 한 후에 배열 순 서 를 늘 리 고 SQL 에서 결 과 를 조회 한 후에 groupno.그룹 을 나 누 었 습 니 다.새로 추 가 된 정렬 은 rank 입 니 다.밖 에 한 층 을 채 웠 고 필요 한 필드 와 rank 열 만 가 져 왔 습 니 다.SQL 로 바로 올 려.
select z.employee_id,z.employee_name,z.group_no,z.salary,z.rank from(
select x.*,@rownum:=@rownum+1,if(@part=x.group_no,@r:=@r+1,@r:=1) as rank,@part:=x.group_no from (
select e.record_id,e.employee_id,e.employee_name,e.group_no,e.salary
from employee e
order by e.group_no,e.salary desc) x,(select @rownum:=0,@part:=null,@r:=0) rt )z

부족 한 점 은 말씀 해 주 십시오.감사합니다.

좋은 웹페이지 즐겨찾기