只选择最早的日期(BigQuery)

时间:2016-04-20 10:22:54

标签: datetime google-bigquery

我想只选择最早的日期。使用Max / Min不起作用,因为它在行级别,并且我无法找到使用over或NTH的方法,因为此查询将每天使用不同数量的服务器运行,w_id和z_id。

以下查询:

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-04-18。

3 个答案:

答案 0 :(得分:2)

我认为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"))

答案 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]

答案 2 :(得分: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