記一次phoenix在不加索引的情況調優,由6s以上時間變成不到1s


背景:

網約車預約單查詢:

 

這里面惡心的地方是:

1個時間窗口要查詢6種時間:推送訂單時間(來自mongodb)、有效搶單時間(來自mongodb)、搶單成功時間(實時kafka)、取消訂單時間(實時kafka)、到達目的地時間(實時kafka)、支付時間(實時kafka)

根據現實的業務情況,乘客即便打車了,也不是立馬支付,很可能過些天才支付。所以不能做表關聯,否則結果會不對(開心不)

因此需要做的就是,將一張表拆成6張表,然后做union操作

最后結果存入了Hbase,用phoenix做查詢;

優化前,phoenix的查詢操作:

SELECT
        "TB1".driver_id,
        "TB1".driver_name,
        "TB1".mobile,
        "TB1".alliance_name,
        "TB1".register_city,
        "TB1".driver_type,
        SUM("TB1".pushOrderNum) AS "pushOrderNum" ,
        SUM("TB1".effectiveSlogan) AS "effectiveSlogan",
        SUM("TB1".grab_sus_order) AS "grab_sus_order",
        SUM("TB1".cancel_order_num) AS "cancel_order_num",
        SUM("TB1".cancel_passenger_num) AS "cancel_passenger_num",
        SUM("TB1".cancel_driver_num) AS "cancel_driver_num",
        SUM("TB1".cancel_service_num) AS "cancel_service_num",
        SUM("TB1".destination_reached_num) AS "destination_reached_num",
        SUM("TB1".pay_num) AS "pay_num",
        SUM("TB1".order_cumulative_num) AS "order_cumulative_num",
        SUM("TB1".order_pay_cumulative_num) AS "order_pay_cumulative_num"
        from
        (SELECT
        "driver_id" ,
        "driver_name" ,
        "mobile" ,
        "alliance_name" ,
        "register_city" ,
        "driver_type" ,
        sum(to_number("pushOrderNum")) AS "pushOrderNum" ,
        sum(0) AS "effectiveSlogan" ,
        sum(0) AS "grab_sus_order" ,
        sum(0) AS "cancel_order_num",
        sum(0) AS "cancel_passenger_num",
        sum(0) AS "cancel_driver_num",
        sum(0) AS "cancel_service_num" ,
        sum(0) AS "destination_reached_num" ,
        sum(0) AS "pay_num" ,
        sum(0) AS "order_cumulative_num",
        sum(0) AS "order_pay_cumulative_num"
        FROM
        "_crontab_reservation"
        WHERE
        CASE WHEN "pushOrderTime" != '0' THEN
        TO_DATE("pushOrderTime",'yyyy-MM-dd') >= TO_DATE(#{start_time},'yyyy-MM-dd')
        AND
        TO_DATE("pushOrderTime",'yyyy-MM-dd') <= TO_DATE(#{end_time},'yyyy-MM-dd')
        ELSE 1=1 END
        <if test="driver_id != null and driver_id !=''">
            and "driver_id"= #{driver_id}
        </if>
        <if test="driver_name != null and driver_name !=''">
            and "driver_name" = #{driver_name}
        </if>
        <if test="mobile != null and mobile !=''">
            and "mobile" = #{mobile}
        </if>
        <if test="alliance_name != null and alliance_name !=''">
            and "driver_management_id" = #{alliance_name}
        </if>
        <if test="register_city != null and register_city !=''">
            and substr("register_city" , 0 , 4) = substr(#{register_city} , 0 , 4)
        </if>
        <if test="driver_type != null and driver_type !=''">
            and "driver_type" = #{driver_type}
        </if>
        GROUP BY
        "driver_id" ,
        "driver_name" ,
        "mobile" ,
        "alliance_name" ,
        "register_city" ,
        "driver_type"

        union all


        SELECT
        "driver_id" ,
        "driver_name" ,
        "mobile" ,
        "alliance_name" ,
        "register_city" ,
        "driver_type" ,
        sum(0) AS "pushOrderNum" ,
        sum(to_number("effectiveSlogan")) AS "effectiveSlogan" ,
        sum(0) AS "grab_sus_order" ,
        sum(0) AS "cancel_order_num",
        sum(0) AS "cancel_passenger_num",
        sum(0) AS "cancel_driver_num",
        sum(0) AS "cancel_service_num" ,
        sum(0) AS "destination_reached_num" ,
        sum(0) AS "pay_num" ,
        sum(0) AS "order_cumulative_num",
        sum(0) AS "order_pay_cumulative_num"
        FROM
        "_crontab_reservation"
        WHERE
        CASE WHEN "_effective_glab_time" != '0' THEN
        TO_DATE("_effective_glab_time",'yyyy-MM-dd') >= TO_DATE(#{start_time},'yyyy-MM-dd')
        AND
        TO_DATE("_effective_glab_time",'yyyy-MM-dd') &lt;= TO_DATE(#{end_time},'yyyy-MM-dd')
        ELSE 1=1 END
        <if test="driver_id != null and driver_id !=''">
            and "driver_id"= #{driver_id}
        </if>
        <if test="driver_name != null and driver_name !=''">
            and "driver_name" = #{driver_name}
        </if>
        <if test="mobile != null and mobile !=''">
            and "mobile" = #{mobile}
        </if>
        <if test="alliance_name != null and alliance_name !=''">
            and "driver_management_id" = #{alliance_name}
        </if>
        <if test="register_city != null and register_city !=''">
            and substr("register_city" , 0 , 4) = substr(#{register_city} , 0 , 4)
        </if>
        <if test="driver_type != null and driver_type !=''">
            and "driver_type" = #{driver_type}
        </if>
        GROUP BY
        "driver_id" ,
        "driver_name" ,
        "mobile" ,
        "alliance_name" ,
        "register_city" ,
        "driver_type"

        union all


        SELECT
        "driver_id" ,
        "driver_name" ,
        "mobile" ,
        "alliance_name" ,
        "register_city" ,
        "driver_type" ,
        sum(0) AS "pushOrderNum" ,
        sum(0) AS "effectiveSlogan" ,
        sum(to_number("grab_sus_order")) AS "grab_sus_order" ,
        sum(0) AS "cancel_order_num",
        sum(0) AS "cancel_passenger_num",
        sum(0) AS "cancel_driver_num",
        sum(0) AS "cancel_service_num" ,
        sum(0) AS "destination_reached_num" ,
        sum(0) AS "pay_num" ,
        sum(0) AS "order_cumulative_num",
        sum(0) AS "order_pay_cumulative_num"
        FROM
        "_crontab_reservation"
        WHERE
        CASE WHEN "grab_sus_time" != '0' THEN
        TO_DATE("grab_sus_time" , 'yyyy-MM-dd') >= TO_DATE(#{start_time} , 'yyyy-MM-dd')
        AND
        TO_DATE("grab_sus_time" , 'yyyy-MM-dd') &lt;= TO_DATE(#{end_time} , 'yyyy-MM-dd')
        ELSE 1=1 END
        <if test="driver_id != null and driver_id !=''">
            and "driver_id"= #{driver_id}
        </if>
        <if test="driver_name != null and driver_name !=''">
            and "driver_name" = #{driver_name}
        </if>
        <if test="mobile != null and mobile !=''">
            and "mobile" = #{mobile}
        </if>
        <if test="alliance_name != null and alliance_name !=''">
            and "driver_management_id" = #{alliance_name}
        </if>
        <if test="register_city != null and register_city !=''">
            and substr("register_city" , 0 , 4) = substr(#{register_city} , 0 , 4)
        </if>
        <if test="driver_type != null and driver_type !=''">
            and "driver_type" = #{driver_type}
        </if>
        GROUP BY
        "driver_id" ,
        "driver_name" ,
        "mobile" ,
        "alliance_name" ,
        "register_city" ,
        "driver_type"

        union all


        SELECT
        "driver_id" ,
        "driver_name" ,
        "mobile" ,
        "alliance_name" ,
        "register_city" ,
        "driver_type" ,
        sum(0) AS "pushOrderNum" ,
        sum(0) AS "effectiveSlogan" ,
        sum(0) AS "grab_sus_order" ,
        sum(to_number("cancel_order_num")) AS "cancel_order_num",
        sum(to_number("cancel_passenger_num")) AS "cancel_passenger_num",
        sum(to_number("cancel_driver_num")) AS "cancel_driver_num",
        sum(to_number("cancel_service_num")) AS "cancel_service_num" ,
        sum(0) AS "destination_reached_num" ,
        sum(0) AS "pay_num" ,
        sum(0) AS "order_cumulative_num",
        sum(0) AS "order_pay_cumulative_num"
        FROM
        "_crontab_reservation"
        WHERE
        CASE WHEN "cancel_time" != '0' THEN
        TO_DATE("cancel_time",'yyyy-MM-dd') >= TO_DATE(#{start_time},'yyyy-MM-dd')
        AND
        TO_DATE("cancel_time",'yyyy-MM-dd') &lt;= TO_DATE(#{end_time},'yyyy-MM-dd')
        ELSE 1=1 END
        <if test="driver_id != null and driver_id !=''">
            and "driver_id"= #{driver_id}
        </if>
        <if test="driver_name != null and driver_name !=''">
            and "driver_name" = #{driver_name}
        </if>
        <if test="mobile != null and mobile !=''">
            and "mobile" = #{mobile}
        </if>
        <if test="alliance_name != null and alliance_name !=''">
            and "driver_management_id" = #{alliance_name}
        </if>
        <if test="register_city != null and register_city !=''">
            and substr("register_city" , 0 , 4) = substr(#{register_city} , 0 , 4)
        </if>
        <if test="driver_type != null and driver_type !=''">
            and "driver_type" = #{driver_type}
        </if>
        GROUP BY
        "driver_id" ,
        "driver_name" ,
        "mobile" ,
        "alliance_name" ,
        "register_city" ,
        "driver_type"

        union all


        SELECT
        "driver_id" ,
        "driver_name" ,
        "mobile" ,
        "alliance_name" ,
        "register_city" ,
        "driver_type" ,
        sum(0) AS "pushOrderNum" ,
        sum(0) AS "effectiveSlogan" ,
        sum(0) AS "grab_sus_order" ,
        sum(0) AS "cancel_order_num",
        sum(0) AS "cancel_passenger_num",
        sum(0) AS "cancel_driver_num",
        sum(0) AS "cancel_service_num" ,
        sum(to_number("destination_reached_num")) AS "destination_reached_num" ,
        sum(0) AS "pay_num" ,
        sum(0) AS "order_cumulative_num",
        sum(0) AS "order_pay_cumulative_num"
        FROM
        "_crontab_reservation"
        WHERE
        CASE WHEN "close_gps_time" != '0' THEN
        TO_DATE("close_gps_time",'yyyy-MM-dd') >= TO_DATE(#{start_time},'yyyy-MM-dd')
        AND
        TO_DATE("close_gps_time",'yyyy-MM-dd') &lt;= TO_DATE(#{end_time},'yyyy-MM-dd')
        ELSE 1=1 END
        <if test="driver_id != null and driver_id !=''">
            and "driver_id"= #{driver_id}
        </if>
        <if test="driver_name != null and driver_name !=''">
            and "driver_name" = #{driver_name}
        </if>
        <if test="mobile != null and mobile !=''">
            and "mobile" = #{mobile}
        </if>
        <if test="alliance_name != null and alliance_name !=''">
            and "driver_management_id" = #{alliance_name}
        </if>
        <if test="register_city != null and register_city !=''">
            and substr("register_city" , 0 , 4) = substr(#{register_city} , 0 , 4)
        </if>
        <if test="driver_type != null and driver_type !=''">
            and "driver_type" = #{driver_type}
        </if>
        GROUP BY
        "driver_id" ,
        "driver_name" ,
        "mobile" ,
        "alliance_name" ,
        "register_city" ,
        "driver_type"

        union all

        SELECT
        "driver_id" ,
        "driver_name" ,
        "mobile" ,
        "alliance_name" ,
        "register_city" ,
        "driver_type" ,
        sum(0) AS "pushOrderNum" ,
        sum(0) AS "effectiveSlogan" ,
        sum(0) AS "grab_sus_order" ,
        sum(0) AS "cancel_order_num",
        sum(0) AS "cancel_passenger_num",
        sum(0) AS "cancel_driver_num",
        sum(0) AS "cancel_service_num" ,
        sum(0) AS "destination_reached_num" ,
        sum(to_number("pay_num")) AS "pay_num" ,
        sum(to_number("order_cumulative_num")) AS "order_cumulative_num",
        sum(to_number("order_pay_cumulative_num")) AS "order_pay_cumulative_num"
        FROM
        "_crontab_reservation"
        WHERE
        CASE WHEN "pay_time" != '0' THEN
        TO_DATE("pay_time",'yyyy-MM-dd') >= TO_DATE(#{start_time},'yyyy-MM-dd')
        AND
        TO_DATE("pay_time",'yyyy-MM-dd') &lt;= TO_DATE(#{end_time},'yyyy-MM-dd')
        ELSE 1=1 END
        <if test="driver_id != null and driver_id !=''">
            and "driver_id"= #{driver_id}
        </if>
        <if test="driver_name != null and driver_name !=''">
            and "driver_name" = #{driver_name}
        </if>
        <if test="mobile != null and mobile !=''">
            and "mobile" = #{mobile}
        </if>
        <if test="alliance_name != null and alliance_name !=''">
            and "driver_management_id" = #{alliance_name}
        </if>
        <if test="register_city != null and register_city !=''">
            and substr("register_city" , 0 , 4) = substr(#{register_city} , 0 , 4)
        </if>
        <if test="driver_type != null and driver_type !=''">
            and "driver_type" = #{driver_type}
        </if>
        GROUP BY
        "driver_id" ,
        "driver_name" ,
        "mobile" ,
        "alliance_name" ,
        "register_city" ,
        "driver_type"
        ) AS "TB1"
        GROUP BY
        "TB1".driver_id ,
        "TB1".driver_name ,
        "TB1".mobile ,
        "TB1".alliance_name ,
        "TB1".register_city ,
        "TB1".driver_type
優化前的phoenix查詢操作

問題:

隨着時間推移,不到兩個月,數據漲到大概200萬左右。每一次查詢能慢到懷疑人生。

問題排查:

phoenix的查詢語句大概是

select a1 , a2 , sum(a3) , sum(a4) ..... from(

select * from table where 條件(推送訂單)

union all

select * from table where 條件(有效搶單)

union all

select * from table where 條件(搶單成功)

union all

select * from table where 條件(取消訂單)

union all

select * from table where 條件(到達目的地)

union all

select * from table where 條件(支付)

)
group by a1 , a2

請注意,200萬條數據,phoenix不加索引,那么每一個表查詢大概花費1秒左右,那么union了6次,就會花費6秒的時間,在加上最后的結果聚合,因此花費的時間超過了6s

並且每個時間字段格式是:yyyy-mm-dd HH:mm:ss

那么每一個司機每天都會有很多的訂單,這樣就導致數據邊的很大。

優化

其實所謂的優化就是瘦表。想辦法讓phoenix在查詢的時候,數據邊的少一些,基於這個宗旨開始使用spark做定時任務的優化,然后在寫入hbase

 //基表
    val _reservation = session
      .read
      .format(GlobalConfigUtils.customHbasePath)
      .options(
        Map(
          GlobalConfigUtils.sparksql_table_schema -> GlobalConfigUtils._spark_reservation,
          GlobalConfigUtils.hbase_table_name -> "_crontab_reservation",
          GlobalConfigUtils.hbase_table_schema -> GlobalConfigUtils._hbase_reservation
        )).load()
    _reservation.createOrReplaceTempView("reservation")
    //緩存表
    session.sqlContext.cacheTable("reservation")

然后迭代出6張小表

//1):推送訂單表
    val _push_order_tb: DataFrame = session.sql(Optimization_resevation._push_order_tb)
    //2):有效訂單表
    val _effective_tb: DataFrame = session.sql(Optimization_resevation._effective_tb)
    //3):搶單成功表
    val _success_glab_order: DataFrame = session.sql(Optimization_resevation._success_glab_order)
    //4):取消訂單表
    val _cancel_order:DataFrame = session.sql(Optimization_resevation._cancel_order)
    //5):到達目的地表
    val _destination_reached_order:DataFrame = session.sql(Optimization_resevation._destination_reached_order)
    //6):支付訂單表
    val _pay_order:DataFrame = session.sql(Optimization_resevation._pay_order)

sql語句就是對每個時間對應的表做時間瘦表,把yyyy-mm-dd HH:mm:ss變成yyyy-mm-dd

lazy val _push_order_tb =
    """
      |select
      |tb.driver_id ,
      |tb.driver_name ,
      |tb.mobile ,
      |tb.alliance_name ,
      |tb.driver_management_id ,
      |tb.register_city ,
      |tb.driver_type ,
      |cast(tb.close_gps_time as string) as close_gps_time,
      |cast(tb.pushOrderTime as string) as pushOrderTime ,
      |cast(tb._effective_glab_time as string) as _effective_glab_time ,
      |cast(tb.pay_time as string) as pay_time,
      |cast(tb.cancel_time as string) as cancel_time,
      |cast(tb.grab_sus_time as string) as grab_sus_time ,
      |sum(tb.pushOrderNum) as pushOrderNum ,
      |sum(0) AS effectiveSlogan ,
      |sum(0) AS grab_sus_order ,
      |sum(0) AS cancel_order_num,
      |sum(0) AS cancel_passenger_num,
      |sum(0) AS cancel_driver_num,
      |sum(0) AS cancel_service_num ,
      |sum(0) AS destination_reached_num ,
      |sum(0) AS pay_num ,
      |sum(0) AS order_cumulative_num,
      |sum(0) AS order_pay_cumulative_num
      |from
      |(
      |select
      |driver_id ,
      |driver_name ,
      |mobile ,
      |alliance_name ,
      |driver_management_id ,
      |register_city ,
      |driver_type ,
      |0 as close_gps_time ,
      |date_format(pushOrderTime,'yyyy-MM-dd') as pushOrderTime ,
      |0 as _effective_glab_time ,
      |0 as pay_time ,
      |0 as cancel_time ,
      |0 as grab_sus_time ,
      |pushOrderNum ,
      |0 AS effectiveSlogan ,
      |0 AS grab_sus_order ,
      |0 AS cancel_order_num,
      |0 AS cancel_passenger_num,
      |0 AS cancel_driver_num,
      |0 AS cancel_service_num ,
      |0 AS destination_reached_num ,
      |0 AS pay_num ,
      |0 AS order_cumulative_num,
      |0 AS order_pay_cumulative_num
      |from
      |reservation
      |where
      |pushOrderTime != '0'
      |and
      |cast(date_format(pushOrderTime , 'yyyyMMdd') as bigint)  < cast(date_format(now() , 'yyyyMMdd') as bigint)
      |) tb
      |GROUP BY
      |tb.driver_id ,
      |tb.driver_name ,
      |tb.mobile ,
      |tb.alliance_name ,
      |tb.driver_management_id ,
      |tb.register_city ,
      |tb.driver_type ,
      |tb.close_gps_time ,
      |tb.pushOrderTime ,
      |tb._effective_glab_time ,
      |tb.pay_time ,
      |tb.cancel_time ,
      |tb.grab_sus_time
    """.stripMargin
View Code

 

然后數據寫入hbase

dF.write
      .mode(SaveMode.Append)
      .options(Map(HBaseTableCatalog.tableCatalog -> catalog , HBaseTableCatalog.newTable -> "8"))
      .format("org.apache.spark.sql.execution.datasources.hbase")
      .save()

 

代碼其實就是將一個表拆成6張表(對應每個不同的時間維度),然后將時間yyyy-mm-dd HH:mm:ss中的數據按照司機ID和yyyy-mm-dd做分組求和。這樣落到hbase就是6張小表了。

然后phoenix在去分別查詢6張小表,在聚合起來即可;

這樣200萬的數據經過優化后,在不加索引的前提下查詢不到1s;

最后的phoenix查詢語句就是分別查6個小表:

SELECT
        "TB1".driver_id,
        "TB1".driver_name,
        "TB1".mobile,
        "TB1".alliance_name,
        "TB1".register_city,
        "TB1".driver_type,
        SUM("TB1".pushOrderNum) AS "pushOrderNum" ,
        SUM("TB1".effectiveSlogan) AS "effectiveSlogan",
        SUM("TB1".grab_sus_order) AS "grab_sus_order",
        SUM("TB1".cancel_order_num) AS "cancel_order_num",
        SUM("TB1".cancel_passenger_num) AS "cancel_passenger_num",
        SUM("TB1".cancel_driver_num) AS "cancel_driver_num",
        SUM("TB1".cancel_service_num) AS "cancel_service_num",
        SUM("TB1".destination_reached_num) AS "destination_reached_num",
        SUM("TB1".pay_num) AS "pay_num",
        SUM("TB1".order_cumulative_num) AS "order_cumulative_num",
        SUM("TB1".order_pay_cumulative_num) AS "order_pay_cumulative_num"
        from
        (SELECT
        "driver_id" ,
        "driver_name" ,
        "mobile" ,
        "alliance_name" ,
        "register_city" ,
        "driver_type" ,
        sum(to_number("pushOrderNum")) AS "pushOrderNum" ,
        sum(0) AS "effectiveSlogan" ,
        sum(0) AS "grab_sus_order" ,
        sum(0) AS "cancel_order_num",
        sum(0) AS "cancel_passenger_num",
        sum(0) AS "cancel_driver_num",
        sum(0) AS "cancel_service_num" ,
        sum(0) AS "destination_reached_num" ,
        sum(0) AS "pay_num" ,
        sum(0) AS "order_cumulative_num",
        sum(0) AS "order_pay_cumulative_num"
        FROM
        "_push_order_tb"
        WHERE
        CASE WHEN "pushOrderTime" != '0' THEN
        TO_DATE("pushOrderTime",'yyyy-MM-dd') >= TO_DATE(#{start_time},'yyyy-MM-dd')
        AND
        TO_DATE("pushOrderTime",'yyyy-MM-dd') &lt;= TO_DATE(#{end_time},'yyyy-MM-dd')
        ELSE 1=1 END
        <if test="driver_id != null and driver_id !=''">
            and "driver_id"= #{driver_id}
        </if>
        <if test="driver_name != null and driver_name !=''">
            and "driver_name" = #{driver_name}
        </if>
        <if test="mobile != null and mobile !=''">
            and "mobile" = #{mobile}
        </if>
        <if test="alliance_name != null and alliance_name !=''">
            and "driver_management_id" = #{alliance_name}
        </if>
        <if test="register_city != null and register_city !=''">
            and substr("register_city" , 0 , 4) = substr(#{register_city} , 0 , 4)
        </if>
        <if test="driver_type != null and driver_type !=''">
            and "driver_type" = #{driver_type}
        </if>
        GROUP BY
        "driver_id" ,
        "driver_name" ,
        "mobile" ,
        "alliance_name" ,
        "register_city" ,
        "driver_type"

        union all


        SELECT
        "driver_id" ,
        "driver_name" ,
        "mobile" ,
        "alliance_name" ,
        "register_city" ,
        "driver_type" ,
        sum(0) AS "pushOrderNum" ,
        sum(to_number("effectiveSlogan")) AS "effectiveSlogan" ,
        sum(0) AS "grab_sus_order" ,
        sum(0) AS "cancel_order_num",
        sum(0) AS "cancel_passenger_num",
        sum(0) AS "cancel_driver_num",
        sum(0) AS "cancel_service_num" ,
        sum(0) AS "destination_reached_num" ,
        sum(0) AS "pay_num" ,
        sum(0) AS "order_cumulative_num",
        sum(0) AS "order_pay_cumulative_num"
        FROM
        "_effective_tb"
        WHERE
        CASE WHEN "_effective_glab_time" != '0' THEN
        TO_DATE("_effective_glab_time",'yyyy-MM-dd') >= TO_DATE(#{start_time},'yyyy-MM-dd')
        AND
        TO_DATE("_effective_glab_time",'yyyy-MM-dd') &lt;= TO_DATE(#{end_time},'yyyy-MM-dd')
        ELSE 1=1 END
        <if test="driver_id != null and driver_id !=''">
            and "driver_id"= #{driver_id}
        </if>
        <if test="driver_name != null and driver_name !=''">
            and "driver_name" = #{driver_name}
        </if>
        <if test="mobile != null and mobile !=''">
            and "mobile" = #{mobile}
        </if>
        <if test="alliance_name != null and alliance_name !=''">
            and "driver_management_id" = #{alliance_name}
        </if>
        <if test="register_city != null and register_city !=''">
            and substr("register_city" , 0 , 4) = substr(#{register_city} , 0 , 4)
        </if>
        <if test="driver_type != null and driver_type !=''">
            and "driver_type" = #{driver_type}
        </if>
        GROUP BY
        "driver_id" ,
        "driver_name" ,
        "mobile" ,
        "alliance_name" ,
        "register_city" ,
        "driver_type"

        union all


        SELECT
        "driver_id" ,
        "driver_name" ,
        "mobile" ,
        "alliance_name" ,
        "register_city" ,
        "driver_type" ,
        sum(0) AS "pushOrderNum" ,
        sum(0) AS "effectiveSlogan" ,
        sum(to_number("grab_sus_order")) AS "grab_sus_order" ,
        sum(0) AS "cancel_order_num",
        sum(0) AS "cancel_passenger_num",
        sum(0) AS "cancel_driver_num",
        sum(0) AS "cancel_service_num" ,
        sum(0) AS "destination_reached_num" ,
        sum(0) AS "pay_num" ,
        sum(0) AS "order_cumulative_num",
        sum(0) AS "order_pay_cumulative_num"
        FROM
        "_success_glab_order_tb"
        WHERE
        CASE WHEN "grab_sus_time" != '0' THEN
        TO_DATE("grab_sus_time" , 'yyyy-MM-dd') >= TO_DATE(#{start_time} , 'yyyy-MM-dd')
        AND
        TO_DATE("grab_sus_time" , 'yyyy-MM-dd') &lt;= TO_DATE(#{end_time} , 'yyyy-MM-dd')
        ELSE 1=1 END
        <if test="driver_id != null and driver_id !=''">
            and "driver_id"= #{driver_id}
        </if>
        <if test="driver_name != null and driver_name !=''">
            and "driver_name" = #{driver_name}
        </if>
        <if test="mobile != null and mobile !=''">
            and "mobile" = #{mobile}
        </if>
        <if test="alliance_name != null and alliance_name !=''">
            and "driver_management_id" = #{alliance_name}
        </if>
        <if test="register_city != null and register_city !=''">
            and substr("register_city" , 0 , 4) = substr(#{register_city} , 0 , 4)
        </if>
        <if test="driver_type != null and driver_type !=''">
            and "driver_type" = #{driver_type}
        </if>
        GROUP BY
        "driver_id" ,
        "driver_name" ,
        "mobile" ,
        "alliance_name" ,
        "register_city" ,
        "driver_type"

        union all


        SELECT
        "driver_id" ,
        "driver_name" ,
        "mobile" ,
        "alliance_name" ,
        "register_city" ,
        "driver_type" ,
        sum(0) AS "pushOrderNum" ,
        sum(0) AS "effectiveSlogan" ,
        sum(0) AS "grab_sus_order" ,
        sum(to_number("cancel_order_num")) AS "cancel_order_num",
        sum(to_number("cancel_passenger_num")) AS "cancel_passenger_num",
        sum(to_number("cancel_driver_num")) AS "cancel_driver_num",
        sum(to_number("cancel_service_num")) AS "cancel_service_num" ,
        sum(0) AS "destination_reached_num" ,
        sum(0) AS "pay_num" ,
        sum(0) AS "order_cumulative_num",
        sum(0) AS "order_pay_cumulative_num"
        FROM
        "_cancel_order_tb"
        WHERE
        CASE WHEN "cancel_time" != '0' THEN
        TO_DATE("cancel_time",'yyyy-MM-dd') >= TO_DATE(#{start_time},'yyyy-MM-dd')
        AND
        TO_DATE("cancel_time",'yyyy-MM-dd') &lt;= TO_DATE(#{end_time},'yyyy-MM-dd')
        ELSE 1=1 END
        <if test="driver_id != null and driver_id !=''">
            and "driver_id"= #{driver_id}
        </if>
        <if test="driver_name != null and driver_name !=''">
            and "driver_name" = #{driver_name}
        </if>
        <if test="mobile != null and mobile !=''">
            and "mobile" = #{mobile}
        </if>
        <if test="alliance_name != null and alliance_name !=''">
            and "driver_management_id" = #{alliance_name}
        </if>
        <if test="register_city != null and register_city !=''">
            and substr("register_city" , 0 , 4) = substr(#{register_city} , 0 , 4)
        </if>
        <if test="driver_type != null and driver_type !=''">
            and "driver_type" = #{driver_type}
        </if>
        GROUP BY
        "driver_id" ,
        "driver_name" ,
        "mobile" ,
        "alliance_name" ,
        "register_city" ,
        "driver_type"

        union all


        SELECT
        "driver_id" ,
        "driver_name" ,
        "mobile" ,
        "alliance_name" ,
        "register_city" ,
        "driver_type" ,
        sum(0) AS "pushOrderNum" ,
        sum(0) AS "effectiveSlogan" ,
        sum(0) AS "grab_sus_order" ,
        sum(0) AS "cancel_order_num",
        sum(0) AS "cancel_passenger_num",
        sum(0) AS "cancel_driver_num",
        sum(0) AS "cancel_service_num" ,
        sum(to_number("destination_reached_num")) AS "destination_reached_num" ,
        sum(0) AS "pay_num" ,
        sum(0) AS "order_cumulative_num",
        sum(0) AS "order_pay_cumulative_num"
        FROM
        "_destination_reached_order_tb"
        WHERE
        CASE WHEN "close_gps_time" != '0' THEN
        TO_DATE("close_gps_time",'yyyy-MM-dd') >= TO_DATE(#{start_time},'yyyy-MM-dd')
        AND
        TO_DATE("close_gps_time",'yyyy-MM-dd') &lt;= TO_DATE(#{end_time},'yyyy-MM-dd')
        ELSE 1=1 END
        <if test="driver_id != null and driver_id !=''">
            and "driver_id"= #{driver_id}
        </if>
        <if test="driver_name != null and driver_name !=''">
            and "driver_name" = #{driver_name}
        </if>
        <if test="mobile != null and mobile !=''">
            and "mobile" = #{mobile}
        </if>
        <if test="alliance_name != null and alliance_name !=''">
            and "driver_management_id" = #{alliance_name}
        </if>
        <if test="register_city != null and register_city !=''">
            and substr("register_city" , 0 , 4) = substr(#{register_city} , 0 , 4)
        </if>
        <if test="driver_type != null and driver_type !=''">
            and "driver_type" = #{driver_type}
        </if>
        GROUP BY
        "driver_id" ,
        "driver_name" ,
        "mobile" ,
        "alliance_name" ,
        "register_city" ,
        "driver_type"

        union all

        SELECT
        "driver_id" ,
        "driver_name" ,
        "mobile" ,
        "alliance_name" ,
        "register_city" ,
        "driver_type" ,
        sum(0) AS "pushOrderNum" ,
        sum(0) AS "effectiveSlogan" ,
        sum(0) AS "grab_sus_order" ,
        sum(0) AS "cancel_order_num",
        sum(0) AS "cancel_passenger_num",
        sum(0) AS "cancel_driver_num",
        sum(0) AS "cancel_service_num" ,
        sum(0) AS "destination_reached_num" ,
        sum(to_number("pay_num")) AS "pay_num" ,
        sum(to_number("order_cumulative_num")) AS "order_cumulative_num",
        sum(to_number("order_pay_cumulative_num")) AS "order_pay_cumulative_num"
        FROM
        "_pay_order_tb"
        WHERE
        CASE WHEN "pay_time" != '0' THEN
        TO_DATE("pay_time",'yyyy-MM-dd') >= TO_DATE(#{start_time},'yyyy-MM-dd')
        AND
        TO_DATE("pay_time",'yyyy-MM-dd') &lt;= TO_DATE(#{end_time},'yyyy-MM-dd')
        ELSE 1=1 END
        <if test="driver_id != null and driver_id !=''">
            and "driver_id"= #{driver_id}
        </if>
        <if test="driver_name != null and driver_name !=''">
            and "driver_name" = #{driver_name}
        </if>
        <if test="mobile != null and mobile !=''">
            and "mobile" = #{mobile}
        </if>
        <if test="alliance_name != null and alliance_name !=''">
            and "driver_management_id" = #{alliance_name}
        </if>
        <if test="register_city != null and register_city !=''">
            and substr("register_city" , 0 , 4) = substr(#{register_city} , 0 , 4)
        </if>
        <if test="driver_type != null and driver_type !=''">
            and "driver_type" = #{driver_type}
        </if>
        GROUP BY
        "driver_id" ,
        "driver_name" ,
        "mobile" ,
        "alliance_name" ,
        "register_city" ,
        "driver_type"
        ) AS "TB1"
        GROUP BY
        "TB1".driver_id ,
        "TB1".driver_name ,
        "TB1".mobile ,
        "TB1".alliance_name ,
        "TB1".register_city ,
        "TB1".driver_type
瘦表后的查詢

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM