Как переписать запрос данных для postgresql? - PullRequest
0 голосов
/ 07 сентября 2018

У меня есть этот запрос

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 не может использоваться без условия, которое является равенством полей с обеих сторон объединения.

Я не понимаю, где я не прав. Как решить эту проблему?

Что нужно взять со стола? Нужно получить Mac разных устройств, которые отправляют информацию в БД с '2018-08-18 00:00:00' до '2018-08-22 23:59:59' (столбец log_time содержит информацию, когда устройство отправляет информацию) и исключая устройства который отправил информацию с интервалом больше 2 минут.

1 Ответ

0 голосов
/ 07 сентября 2018

Ниже приведен простой пример для BigQuery Standard 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 минутам, и, наконец, считаем «выжившие» macs

Вы можете настроить логику так, как вам нужно в вашем конкретном случае

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...