2016-04-20 72 views
0

我只想選擇最早的日期。使用最大值/最小值不起作用,因爲它處於行級別,並且我無法找出使用over或NTH的方法,因爲此查詢將每天使用不同數量的服務器w_id和z_id運行。只選擇最早的日期(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

最內部的選擇是你不變原始 其餘的是包裝採取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