Как иметь одно поле даты или написать это более эффективно - PullRequest
1 голос
/ 19 июня 2019

Мы написали запрос, в котором подсчитывается время, необходимое для направления электронной почты из Gmail в стороннюю службу безопасности, а затем возврата в Gmail.Теперь мы хотим отобразить это в DataStudio, но способ его написания требует указания дня в двух местах, чтобы уменьшить количество запрашиваемых разделов, однако большинство систем, таких как DataStudio, могут работать только с одним полем для временных диапазонов.Как еще я могу написать это так, чтобы одно поле использовалось для временного диапазона?

SELECT
datetime_diff(timestamp_after, timestamp_before, SECOND) as delay,
timestamp_before,
timestamp_after,
sender_before as sender,
recipient_before as recipient,
message_id_before as message_id,
subject_before as subject,
spf_pass_before,
spf_pass_after,
pt_before,
pt_after
FROM(
  SELECT
    _TABLE_SUFFIX as pt_after,
    DATETIME(timestamp_micros(event_info. timestamp_usec), "America/New_York") as timestamp_after,
    message_info.rfc2822_message_id as message_id_after,
    message_info.connection_info.spf_pass as spf_pass_after,
    message_info.source.address as sender_after,
    message_info.subject as subject_after,
    dest.address as recipient_after,
    rule.rule_name as rule_name_after
  FROM
    `g-suite-logs.gmail_logs.daily_*`,
    UNNEST ( message_info.destination ) as dest,
    UNNEST ( message_info.triggered_rule_info ) as rule
   WHERE rule.rule_name = "AFTER RETURNING FROM THIRD PARTY SYSTEM"
  GROUP BY
    pt_after,
    message_id_after,
    timestamp_after,
    spf_pass_after,
    sender_after,
    recipient_after,
    rule_name_after,
    subject_after
  ) rule_after
JOIN(
  SELECT
    _TABLE_SUFFIX as pt_before,
    DATETIME(timestamp_micros(event_info. timestamp_usec), "America/New_York") as timestamp_before,
    message_info.rfc2822_message_id as message_id_before,
    message_info.connection_info.spf_pass as spf_pass_before,
    message_info.source.address as sender_before,
    message_info.subject as subject_before,
    dest.address as recipient_before,
    rule.rule_name as rule_name_before
  FROM
    `g-suite-logs.gmail_logs.daily_*`,
    UNNEST ( message_info.destination ) as dest,
    UNNEST ( message_info.triggered_rule_info ) as rule
  WHERE rule.rule_name = "BEFORE ROUTING TO THIRD PARTY SYSTEM"
  GROUP BY
    pt_before, 
    message_id_before,
    timestamp_before,
    spf_pass_before,
    sender_before,
    recipient_before,
    rule_name_before,
    subject_before
  ) rule_before
ON
  rule_before.message_id_before = rule_after.message_id_after AND recipient_before = recipient_after

Я могу сохранить это как представление и установить 'WHERE pt_before = "20190618" AND pt_after = "20190618"', иэто значительно снижает стоимость запроса (с 1,5 ТБ до 24 ГБ), но тогда я не могу легко подключить представление к DataStudio, поскольку необходимо использовать два поля даты.

Один из вариантов - использоватьпараметризованные запросы, но я не думаю, что DataStudio их поддерживает.

В отдельной теме this - это то, как я изначально написал запрос, что кажется более эффективным, однако я нашелмного ложных срабатываний с этим запросом, где он соответствовал одному правилу, но не другому, и записывал временную разницу 0, искажая результаты.Так что, если у кого-то есть предложения по более эффективному способу написания этого, я открыт для предложений.

...