2016-04-20 73 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