可否将下表中的数据:
airline  flight  org_city  cki_date   iflt
CA  1234    PEK       2006-01-01 1
CA  3234    PEK       2006-01-02 1
SZ  1134    CAN       2006-01-01 1
SZ  1113    CAN       2006-01-01 0
SZ  1255    PEK       2006-01-02 1
SZ  1325    PEK       2006-01-03 1
SZ  1025    PEK       2006-01-04 1
SZ  1235    PEK       2006-01-05 1
SC  2204    PEK       2006-01-03 0转换成:(其中number是:将iflt=0的同一个airline记录累加,iflt=1的同一个airline记录累加)
ariline  iflt  number
CA       0  1
CA  1  1
SZ  0  1
SZ  1  5
SC  0    1
要求:按照airline和iflt聚类,也就是说同一个airline的记录要在一起,同时一个airline对应两条记录,即iflt=0和iflt=1的。请高手指点!谢谢!

解决方案 »

  1.   

    select substr(airline,1,2) airline, iflt, sum(1) from table 
    group by substr(airline,1,2),iflt
    order by substr(airline,1,2),iflt;
      

  2.   

    谢谢楼上的回答,
    但用您的sql出来的数据不太准确,因为没有按照cki_date和org_city聚类,有可能同一天cki_date,同一个flight会有两条或多条记录,需要取出一条,但如果group by中添加这两个字段,最后的结果又不是按照每个airline有两条记录的方式显示了,请问可以解决么?
      

  3.   

    因为没有按照cki_date和org_city聚类,有可能同一天cki_date,同一个flight会有两条或多条记录,需要取出一条如果同一天同一城市多条记录,那么取出其他哪一条呢?
      

  4.   

    是这样,对于:
    airline  flight  org_city  cki_date  iflt 
    CA  1234    PEK      2006-01-01 1 
    CA  3234    PEK      2006-01-02 1 
    SZ  1134    CAN      2006-01-01 1 
    SZ  1113    CAN      2006-01-01 0 
    SZ  1255    PEK      2006-01-02 1 
    SZ  1325    PEK      2006-01-03 1 
    SZ  1025    PEK      2006-01-04 1 
    SZ  1235    PEK      2006-01-05 1 
    SC  2204    PEK      2006-01-03 0 
    SELECT airline, iflt, flight, cki_date, org_city
    FROM  tbl_cstd
    WHERE cki_date>=to_date('20060101', 'YYYYMMDD') and cki_date<=to_date('20060131', 'YYYYMMDD')
    GROUP BY airline,iflt, flight, cki_date, org_city
    ORDER BY airline;
    之前是用这个SQL取出记录在code里做累加,如果出现同一个cki_date,同一个flight有可能有两条或多条记录,例如:
    airline  flight  org_city  cki_date  iflt des_city
    CA  1234    PEK      2006-01-01 0    CAN
    CA  1234    PEK      2006-01-01 0    PVG
    flight是1234的会从PEK到CAN然后从CAN到PVG,但数据库中记录的是两条,我现在就需要将这两条记录算作一条取出来,所以用到了GROUP BY airline,iflt, flight, cki_date, org_city,但code中做累加FETCH速度太慢了,如果30000条记录,需要7s,所以我想是不是可以通过SQL将记录数量减少,用了如下的SQL:
    SELECT airline, iflt, count(*), cki_date
    FROM  tbl
    WHERE cki_date>=to_date('20060101', 'YYYYMMDD') and cki_date<=to_date('20060131', 'YYYYMMDD')
    GROUP BY airline, iflt, cki_date
    order by airline
    现在得到的就是:
    airline iflt    count(*) cki_date
    CA 0 507 2006-01-01
    CA 0 536 2006-01-02
    ...
    CA 0 556 2006-01-31
    ...
    CA 1 139 2006-01-01
    CA 1 123 2006-01-02
    ...
    CA 1 121 2006-01-31
    ...
    即按照天数将结果聚类,但现在的问题是比如在2006-01-01,有可能存在:
    airline  flight  org_city  cki_date  iflt des_city
    CA  1234    PEK      2006-01-01 0    CAN
    CA  1234    PEK      2006-01-01 0    PVG
    这种情况,这样的话,SQL就将记录数算作两条而不是一条了,如果加上GROUP BY airline,iflt, flight, cki_date, org_city,那速度和原来就是一样的慢了,所以不知道还能不能再聚类得到正确的结果呢?
      

  5.   

    想到有分析函数over做 partition by但是性能并不会好多少
      

  6.   

    那用over可以将记录集缩小么?按什么分区呢?
      

  7.   

    partition by 和group by 效果是一致的,所以我想这并不能将记录集缩小,因此效率也不会好多少也许楼下会有更好的解决方式,赫赫,期待