2016-04-20 11 views
0

最も古い日付のみを選択したいと思います。 Max/Minの使用は行レベルであるため動作しません。このクエリは毎日異なる数のサーバー、w_idおよびz_idで実行されるため、overまたはNTHを使用する方法を理解できませんでした。最も古い日付(BigQuery)のみを選択してください

次のクエリ:

select server, w_id, z_id, date(datetime) as day 
from(SELECT server, w_id, datetime, demand.b_id as id, demand.c_type, z_id, 
    FROM TABLE_DATE_RANGE(v3_data.v3_,DATE_ADD(CURRENT_DATE(),-2,"day"), 
      DATE_ADD(CURRENT_DATE(),-1,"day")) 
    where demand.b_id is not null and demand.c_type = 'rtb' 
    group by 1,2,3,4,5,6 
    having datetime >= DATE_ADD(CURRENT_DATE(),-2,"day") 
) 
group by 1,2,3,4 
having count(day)<2 
order by z_id, day 

は結果を与える:

Row server  w_id z_id  day 
1  A   722 1837 2016-04-19 
2  SPORTS  51 2534 2016-04-19 
3  A  1002 2546 2016-04-18 
4  A  1303 3226 2016-04-19 
5  A  1677 4369 2016-04-18 
6  NEW  13608 9370 2016-04-19 

だから、上から私は2016年4月18日たいと思います。外出先で行ったように - - 選択

答えて

1

ほとんどの内部は、1つの 残りはラッパーmin_day テストされていないの世話をしているあなたの手つかずの元ですが、少なくともあなたのアイデア

SELECT server, w_id, z_id, [day] 
FROM (
    SELECT server, w_id, z_id, [day], MIN([day]) OVER() AS min_day    
    FROM (             
    SELECT server, w_id, z_id, DATE(datetime) AS [day] 
    FROM ( 
     SELECT server, w_id, datetime, demand.b_id AS id, demand.c_type, z_id, 
     FROM TABLE_DATE_RANGE(v3_data.v3_,DATE_ADD(CURRENT_DATE(),-2,"day"), DATE_ADD(CURRENT_DATE(),-1,"day")) 
     WHERE demand.b_id IS NOT NULL AND demand.c_type = 'rtb' 
     GROUP BY 1,2,3,4,5,6 
     HAVING datetime >= DATE_ADD(CURRENT_DATE(),-2,"day") 
    ) 
    GROUP BY 1,2,3,4 
    HAVING COUNT([day])<2 
)              
)              
WHERE [day] = min_day          
ORDER BY z_id, [day] 
+0

私は作品を作ったと思いますが、あなたの作品は将来のウィンドウ機能に役立ちました。 –

1

を与える必要があり、私はGROUP_CONCATのかもしれないと思います仕事は非常に単純ここで終わら:

SELECT 
    server, 
    w_id, 
    z_id, 
    day, 
FROM (
    SELECT 
    server, 
    w_id, 
    z_id, 
    GROUP_CONCAT(day) day, 
    FROM (
    SELECT 
     server, 
     w_id, 
     DATE(datetime) day, 
     demand.b_id AS id, 
     demand.c_type, 
     z_id, 
    FROM 
     TABLE_DATE_RANGE(v3_data.v3_,DATE_ADD(CURRENT_DATE(),-2,"day"), DATE_ADD(CURRENT_DATE(),-1,"day")) 
    WHERE 
     demand.b_id IS NOT NULL 
     AND demand.c_type = 'rtb' 
     AND DATE(datetime) >= DATE(DATE_ADD(CURRENT_DATE(),-2,"day")) 
    GROUP BY 
     1,2,3,4,5,6 
    ORDER BY 
     day) # Critical to order this dimension to make the GROUP_CONCAT permutations unique 
    GROUP BY 
    server, 
    w_id, 
    z_id, 
    # day is aggregated in GROUP_CONCAT and so it does not get included in the GROUP BY 
    ) 
WHERE 
    day = DATE(DATE_ADD(CURRENT_DATE(),-2,"day")) 
+0

これはうまくいきませんでしたが、将来group_concatが役立つようになりました。私は自分の編集がうまくいくと信じており、シンプルでした –

+0

demand.b_idを削除すると、編集したものと一致するクエリが得られました。私は、z_idがrtbに参加するのを止め、b_idが最後に必要ではないことを知りたかっただけです。それぞれのz_idに対して複数のb_idを持つと考えて、偽陽性/偽陰性を出し、クエリを混乱させました。 –

0

どちらのソリューションが参考にされているが、私はどちらも私が望んでいた道を働いたと考えていると、次のことを行います。

select server, w_id, id, demand.c_type,z_id, 

NTH(1, day) First, NTH(2, day) Second, 

from(

SELECT 
     server, 
     w_id, 
     DATE(datetime) as day, 
     demand.b_id AS id, 
     demand.c_type, 
     z_id, 

FROM 
     TABLE_DATE_RANGE([black-beach-789:v3_data.v3_],DATE_ADD(CURRENT_DATE(),-2,"day"), DATE_ADD(CURRENT_DATE(),-1,"day")) 

WHERE 
     demand.b_id IS NOT NULL 

AND demand.c_type = 'rtb' 

AND DATE(datetime) >= DATE(DATE_ADD(CURRENT_DATE(),-2,"day")) 

GROUP BY 
     1,2,3,4,5,6 

order by day 
    ) 

group by 1,2,3,4,5 

having first = date(DATE_ADD(CURRENT_DATE(),-2,"day")) and Second is null 
関連する問題