如何覆盖PostgreSQL的数据请求?

时间:2018-09-07 17:50:00

标签: google-bigquery

我有这个查询

select count(distinct mac)
from t out
where radar_id = '32'
  and log_time >= '2018-08-18 00:00:00'
  and log_time < '2018-08-22 23:59:59'
  and mac not in
      (select mac from t as inn where out.log_time - interval '2 minutes' > inn.log_time);

我将其重写为

select count(distinct mac)
from `test-from-frelance.123.sniffer_logs` out
where radar_id = '32'
  and log_time >= '2018-08-18 00:00:00'
  and log_time < '2018-08-22 23:59:59'
  and mac not in
      (select mac 
      from `test-from-frelance.123.sniffer_logs` as inn 
      where TIMESTAMP_SUB(out.log_time, interval 2 minute) > inn.log_time );

但是我得到了错误:

  

如果没有连接两侧的字段相等的条件,则不能使用LEFT OUTER JOIN。

我不明白我在哪里错。如何解决这个问题?

从桌子上需要得到什么?需要获取从'2018-08-18 00:00:00'到'2018-08-22 23:59:59'以来向db发送信息的mac机不同设备(设备发送信息时,log_time列包含信息)并且不包括设备以大于2分钟的间隔发送信息。

1 个答案:

答案 0 :(得分:3)

下面是BigQuery标准SQL的简单示例

#standardSQL
SELECT COUNT(1) devices FROM (
  SELECT mac FROM (
    SELECT mac, 
      TIMESTAMP_DIFF(log_time, LAG(log_time) OVER(PARTITION BY mac ORDER BY log_time), MINUTE) delta
    FROM `test-from-frelance.123.sniffer_logs` out
    WHERE radar_id = '32'
      AND log_time >= '2018-08-18 00:00:00'
      AND log_time < '2018-08-22 23:59:59'
  )
  GROUP BY mac
  HAVING MIN(delta) > 2  
)

在这里,首先我们计算给定mac的连续条目之间的距离/间隔,然后过滤掉那些至少少于/等于2分钟的条目/间隔,最后算出“幸存”的mac

您可以根据具体情况调整逻辑以适应您的需求