今天遇到了一个复杂的数据需求
假设公司表(M_COMPANY)的Layout如下:
字段名 | 字段名(英) | 类型 | 长度 | 约束 |
公司编码 | company_code | VARCHAR | 6 | P |
公司名字 | company_name | VARCHAR | 20 | |
开始时间 | startYMD | Date | 8 | P |
终止时间 | endYMD | Date | 8 | P |
表中数据如下:
公司编码 | 公司名字 | 开始时间 | 终止时间 |
600001 | 公司A1 | 2013/9/10 | 2014/9/10 |
600001 | 公司A2 | 2013/8/10 | 2014/8/10 |
600001 | 公司A3 | 2013/8/10 | 2015/8/10 |
600002 | 公司B1 | 2013/9/10 | 2014/9/10 |
600002 | 公司B2 | 2013/8/10 | 2014/8/10 |
600002 | 公司B3 | 2011/8/10 | 2015/8/10 |
现在要求抽出公司名字,当公司编码重复时,抽出开始时间和终止时间都最大的那一条。
SQL的思路如下:
1.用“公司编码”进行分组,找出相同公司编码下”开始时间“最大的数据集T1
2.把T1作为筛选条件,找出相同”公司编码+最大开始时间“下终止时间最大的数据集T2
3.把T2作为筛选条件,求出满足条件的公司编码。
最后的SQL如下
SELECT company_name FROM M_COMPANY WHERE (company_code || startYMD || endYMD) IN ( SELECT company_code || startYMD || MAX(endYMD) FROM M_COMPANY WHERE (company_code || startYMD) IN ( SELECT company_code || MAX(startYMD) FROM M_COMPANY GROUP BY company_code ) GROUP BY company_code, startYMD )
为了提高SQL的执行效率,可以进一步优化
SELECT company_name FROM M_COMPANY WHERE (company_code || startYMD || endYMD) IN ( SELECT company_code || MAX(startYMD || endYMD) FROM M_COMPANY GROUP BY company_code )
这样通过MAX(startYMD || endYMD)可以通过group一次,找到startYMD和endYMD最大的记录。
今天遇到了一个复杂的数据需求 假设公司表(M_COMPANY)的Layout如下:
字段名 | 字段名(英) | 类型 | 长度 | 约束 |
公司编码 | company_code | VARCHAR | 6 | P |
公司名字 | company_name | VARCHAR | 20 | |
开始时间 | startYMD | Date | 8 | P |
终止时间 | endYMD | Date | 8 | P |
公司编码 | 公司名字 | 开始时间 | 终止时间 |
600001 | 公司A1 | 2013/9/10 | 2014/9/10 |
600001 | 公司A2 | 2013/8/10 | 2014/8/10 |
600001 | 公司A3 | 2013/8/10 | 2015/8/10 |
600002 | 公司B1 | 2013/9/10 | 2014/9/10 |
600002 | 公司B2 | 2013/8/10 | 2014/8/10 |
600002 | 公司B3 | 2011/8/10 | 2015/8/10 |
SELECT company_name FROM M_COMPANY WHERE (company_code || startYMD || endYMD) IN ( SELECT company_code || startYMD || MAX(endYMD) FROM M_COMPANY WHERE (company_code || startYMD) IN ( SELECT company_code || MAX(startYMD) FROM M_COMPANY GROUP BY company_code ) GROUP BY company_code, startYMD )为了提高SQL的执行效率,可以进一步优化 这样通过MAX(startYMD || endYMD)可以通过group一次,找到startYMD和endYMD最大的记录。