2017-07-20 3 views
0

SQL神...私はいくつかの助けが必要です!SQLクエリの問題 - 最大数があるときの最小時間の選択

私はroute_complete_percentage列とcreated_at列を持つデータテーブルを持っています。

Iは、データの2個必要:(のcreated_atカラム内)

  • ゼロタイムスタンプをしないroute_complete_percentageが最小であるとき

    1. (のcreated_atカラム内の)タイムスタンプが、 route_complete_percentageは最大値ですが、100%であってもなくてもかまいませんが、最高値のときです。

    ここではキッカーですが、最も高いルート完了列のタイムスタンプが複数ある可能性があります。例えば、route_completion_percentageが最大であるとき

    Example Table

    私は複数の値を持っているが、私は最小のタイムスタンプ値を必要とします。

    ここまではクエリですが、2つのタイムスタンプは同じです。

    SELECT 
    A.fc, 
    A.plan_id, 
    A.route_id, 
    mintime.first_scan AS First_Batch_Scan, 
    min(route_complete_percentage), 
    maxtime.last_scan AS Last_Batch_Scan, 
    max(route_complete_percentage) 
    
    FROM 
    (SELECT 
        fc, 
         plan_id, 
         route_id, 
         route_complete_percentage, 
         CONCAT(plan_id, '-', route_id) AS JOINKEY 
    FROM 
        houdini_ops.BATCHINATOR_SCAN_LOGS_V2 
        WHERE 
         fc <> '' 
         AND order_id <> 'Can\'t find order' 
         AND source = 'scan' 
         AND created_at > DATE_ADD(CURDATE(), INTERVAL - 3 DAY)) A 
        LEFT JOIN 
    (SELECT 
        l.fc, 
         l.route_id, 
         l.plan_id, 
         CONCAT(l.plan_id, '-', l.route_id) AS JOINKEY, 
         CASE 
          WHEN MIN(route_complete_percentage) THEN  CONVERT_TZ(l.created_at, 'UTC', s.time_zone) 
         END AS first_scan 
    FROM 
        houdini_ops.BATCHINATOR_SCAN_LOGS_V2 l 
    JOIN houdini_ops.O_SERVICE_AREA_ATTRIBUTES s ON l.fc = s.default_station_code 
    WHERE 
         l.fc <> '' 
         AND l.order_id <> 'Can\'t find order' 
         AND l.source = 'scan' 
         AND l.created_at > DATE_ADD(CURDATE(), INTERVAL - 3 DAY) 
    GROUP BY fc , plan_id , route_id) mintime ON A.JOINKEY = mintime.JOINKEY 
        LEFT JOIN 
    (SELECT 
         l.fc, 
         l.route_id, 
         l.plan_id, 
         CONCAT(l.plan_id, '-', l.route_id) AS JOINKEY, 
         CASE 
          WHEN MAX(route_complete_percentage) THEN  CONVERT_TZ(l.created_at, 'UTC', s.time_zone) 
         END AS last_scan 
    FROM 
        houdini_ops.BATCHINATOR_SCAN_LOGS_V2 l 
    JOIN houdini_ops.O_SERVICE_AREA_ATTRIBUTES s ON l.fc = s.default_station_code 
    WHERE 
        l.fc <> '' 
         AND l.order_id <> 'Can\'t find order' 
         AND l.source = 'scan' 
         AND l.created_at > DATE_ADD(CURDATE(), INTERVAL - 3 DAY) 
    GROUP BY fc , plan_id , route_id) maxtime ON mintime.JOINKEY = maxtime.JOINKEY 
    GROUP BY fc , plan_id , route_id 
    
  • 答えて

    0

    私は残りのクエリに干渉したくありません。あなたが必要と思うようなことをするものがここにあります。サンプルデータが含まれています。 - 私は空白の値をサンプルデータからのヌルと解釈しました。

    基本的には、それぞれのroute_complete_percentageグループ内にMinimum created_at値があります。そこで、私はroute_complete_percentageをグループ識別子として扱いました。しかし、あなたは2つのグループだけを気にしているので、まずグループ内のグループを特定し、それらを使用して集約クエリをフィルタリングします。

    if object_id('tempdb.dbo.#Data') is not null drop table #Data 
    go 
    
    create table #Data (
        route_complete_percentage int, 
        created_at datetime 
    ) 
    
    insert into #Data (route_complete_percentage, created_at) 
        values 
         (0, '20170531 19:58'), 
         (1, null), 
         (2, null), 
         (3, null), 
         (4, null), 
         (5, null), 
         (6, null), 
         (7, null), 
         (80, null), 
         (90, null), 
         (100, '20170531 20:10'), 
         (100, '20170531 20:12'), 
         (100, '20170531 20:15') 
    
    ;with cteMinMax(min_route_complete_percentage, max_route_complete_percentage) as (
        select 
         min(route_complete_percentage), 
         max(route_complete_percentage) 
         from #Data D 
          -- This ensures the condition that you don't get the timestamp for 0 
          where D.route_complete_percentage > 0 
    ) 
    select 
        route_complete_percentage, 
        min_created_at = min(created_at) 
        from #Data D 
         join cteMinMax MM on D.route_complete_percentage in (MM.min_route_complete_percentage, MM.max_route_complete_percentage) 
        group by route_complete_percentage 
    
    関連する問題