在 SQL 中我有下面的表 t_test:
emp_code | period_month | company_code NIK001 | 01 | ALPHA NIK001 | 02 | ALPHA NIK001 | 03 | ALPHA NIK001 | 04 | ALPHA NIK001 | 05 | ALPHA NIK001 | 06 | BETA NIK001 | 07 | BETA NIK001 | 08 | BETA NIK001 | 09 | BETA NIK001 | 10 | ALPHA NIK001 | 11 | ALPHA NIK001 | 12 | ALPHA
我想查询以下结果:
emp_code | company_code | from_month | to_month -------------------------------------------------- NIK001 | ALPHA | 01 | 05 NIK001 | BETA | 06 | 09 NIK001 | ALPHA | 10 | 12
最佳答案
这让我害怕得发抖,但它确实输出了你所追求的近似值:
select w.emp_code, w.company_code, w.period_month from_month,
(select min(convert(u.period_month,unsigned))-1 from t_test u where u.emp_code=w.emp_Code and convert(u.period_month,signed)>convert(w.period_month,signed) and u.company_code<>w.company_code) to_month
from
(
select * from
(
select y.emp_code, y.period_month, y.company_code,
(select x.company_code from t_test x where x.emp_code=y.emp_code and convert(x.period_month,unsigned)<convert(y.period_month,unsigned) order by convert(x.period_month,unsigned) desc limit 1) previous_company_code
from t_test y
) z
where company_code<>previous_company_code or previous_company_code is null
) w
不过,我出于好奇尝试了这个。对于您的生产环境,您不应该真的依赖任何类似的东西。我认为简单的 SQL 查询不适合您的问题。我会去别处看看。
编辑:基于下表:
CREATE TABLE `t_test` (
`emp_code` varchar(50) DEFAULT NULL,
`period_month` varchar(2) DEFAULT NULL,
`company_code` varchar(50) DEFAULT NULL
);
填充了以下 INSERT 语句:
INSERT INTO `t_test` (`emp_code`,`period_month`,`company_code`)
VALUES
('NIK001', '01', 'ALPHA'),
('NIK001', '02', 'ALPHA'),
('NIK001', '03', 'ALPHA'),
('NIK001', '04', 'ALPHA'),
('NIK001', '05', 'ALPHA'),
('NIK001', '06', 'BETA'),
('NIK001', '07', 'BETA'),
('NIK001', '08', 'BETA'),
('NIK001', '09', 'BETA'),
('NIK001', '10', 'ALPHA'),
('NIK001', '11', 'ALPHA'),
('NIK001', '12', 'ALPHA');
关于mysql group 通过使用范围记录值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5691159/