一个复杂的SQL文

今天遇到了一个复杂的数据需求

 

假设公司表(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
现在要求抽出公司名字,当公司编码重复时,抽出开始时间和终止时间都最大的那一条。   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的执行效率,可以进一步优化  这样通过MAX(startYMD || endYMD)可以通过group一次,找到startYMD和endYMD最大的记录。    

猜你喜欢

转载自cherryl-zhao.iteye.com/blog/2114637