Deze functie wordt ondersteund in de volgende versies: Frontline Standard en Frontline Plus, Enterprise Standard en Enterprise Plus, Education Standard en Education Plus, Enterprise Essentials Plus. Versies vergelijken
Dit artikel bevat voorbeeldquery's voor veelgebruikte rapporten die u kunt bekijken in BigQuery. In deze voorbeeldquery's wordt uitgegaan van verouderde SQL. Vervang api_project_name.dataset_name
door uw eigen projectnaam en datasetnaam.
Meer informatie over zoeken in BigQuery-gegevens.
Zie Schema voor Gmail-activiteitslogboeken in BigQuery voor de Gmail-logboekvelden en de betekenis ervan.
Voorbeelden van zoekopdrachten
AccountsHet aantal beheerde en gemachtigde accounts en het aantal uitgeschakelde, geblokkeerde en opgeschorte (per datum) accounts.
SELECT date,
accounts.num_locked_users,
accounts.num_disabled_accounts,
accounts.num_delegated_admins,
accounts.num_super_admins,
accounts.num_suspended_users,
accounts.num_users
FROM api_project_name.dataset_name.usage
WHERE accounts.num_users IS NOT NULL
ORDER BY date ASC;
De meest uitgevoerde gebeurtenissen door een beheerder.
SELECT count(*) as admin_actions, event_name
FROM api_project_name.dataset_name.activity
WHERE email IN (
SELECT user_email
FROM api_project_name.dataset_name.usage
WHERE accounts.is_super_admin = TRUE
)
GROUP BY 2
ORDER BY 1 DESC;
Het aantal hoofdgebruikers zoeken in een bepaald domein.
SELECT COUNT(DISTINCT user_email) as number_of_super_admins, date
FROM api_project_name.dataset_name.usage
WHERE accounts.is_super_admin = TRUE
GROUP BY 2
ORDER BY 2 DESC;
Alleen standaard SQL
De verhouding van gebruikers die in de afgelopen dag actief waren tot de gebruikers die in de afgelopen 30 dagen actief waren in Google Agenda.In dit voorbeeld wordt er in meerdere tabellen gezocht.
Dagelijks actieve gebruikers
SELECT date, calendar.num_1day_active_users
FROM api_project_name.dataset_name.usage
WHERE calendar.num_1day_active_users IS NOT NULL
ORDER BY date DESC
Gebruikers die in de afgelopen 30 dagen actief waren
SELECT date, calendar.num_30day_active_users
FROM api_project_name.dataset_name.usage
WHERE calendar.num_30day_active_users IS NOT NULL
ORDER BY date DESC;
Aantal agenda-afspraken per type.
SELECT COUNT(DISTINCT calendar.calendar_id) AS count, event_name
FROM api_project_name.dataset_name.activity
WHERE calendar.calendar_id IS NOT NULL
GROUP BY 2 ORDER BY 1 DESC;
Aantal gedeelde Google Drive-items, gesorteerd op deelmethode.
SELECT COUNT(DISTINCT drive.doc_id) AS count, drive.visibility
FROM api_project_name.dataset_name.activity
WHERE drive.doc_id IS NOT NULL
GROUP BY 2 ORDER BY 1 DESC;
Bestands-ID, titel, eigenaar en type. Bestanden die extern zijn gedeeld binnen deze periode.
SELECT TIMESTAMP_MICROS(time_usec) AS date, drive.doc_id, drive.doc_title,
drive.owner, drive.doc_type
FROM api_project_name.dataset_name.activity
WHERE drive.visibility = "shared_externally"
ORDER BY 1 DESC
LIMIT 100;
Wijzigingen aan rechten voor delen en de resultaten ervan. Hiermee kunt u zien welke wijzigingen aan rechten hebben gezorgd dat de zichtbaarheid van het bestand werd gewijzigd.
SELECT TIMESTAMP_MICROS(time_usec) AS date, drive.doc_title,
drive.visibility_change,drive.old_visibility, drive.visibility,
FROM api_project_name.dataset_name.activity
WHERE record_type = "drive"
AND drive.old_visibility IS NOT NULL
AND drive.old_visibility != "unknown";
Gebeurtenistypen gesorteerd per bestandstype. Handig als u gebruiksrapporten wilt zien per bestandstype.
SELECT drive.doc_type, event_type, count(*)
FROM api_project_name.dataset_name.activity
WHERE record_type = "DRIVE"
GROUP by 1,2 ORDER BY 3 desc;
Gebeurtenistype en -naam voor elke gedeelde Drive.
SELECT drive.shared_drive_id, event_type, event_name, record_type,
count(distinct drive.doc_id) AS count
FROM api_project_name.dataset_name.activity
WHERE record_type = "drive"
AND drive.shared_drive_id IS NOT NULL
GROUP BY 1,2,3,4 ORDER BY 5 DESC;
Informatie over gebruikers buiten uw domein.
SELECT email, event_name, count(*) AS count
FROM api_project_name.dataset_name.activity
WHERE email != ""
AND email NOT LIKE "%mydomain.com%"
GROUP BY 1,2 ORDER BY 3 DESC;
Welke rechten zijn gegeven aan externe gebruikers en wanneer.
SELECT drive.target_user, event_name, count(*) AS count
FROM api_project_name.dataset_name.activity
WHERE drive.target_user IS NOT NULL
AND drive.target_user NOT LIKE "%mydomain.com%"
GROUP BY 1,2 ORDER BY 3 DESC;
Informatie over opslagcontrole
Handig als u rapporten wilt maken over gebruikers die meer dan een bepaalde hoeveelheid Drive-opslag gebruiken, met een vastgestelde drempelwaarde (opgegeven met de clausule AND accounts.drive_used_quota_in_mb > 0
).
Deze query kan bijvoorbeeld worden ingesteld als een geplande query of kan periodiek worden aangeroepen met de API.
SELECT date,
user_email,
accounts.drive_used_quota_in_mb,
FROM api_project_name.dataset_name.usage
WHERE accounts.drive_used_quota_in_mb IS NOT NULL
AND accounts.drive_used_quota_in_mb > 0
AND user_email != ""
AND date = CAST(DATE_SUB(CURRENT_DATE(), INTERVAL 7 DAY) AS STRING)
ORDER BY 3,1 DESC;
Opmerkingen:
- De waarde kan worden aangepast zodat deze overeenkomt met het filter dat de klant instelt. Bijvoorbeeld meer dan 15 GB:
AND accounts.drive_used_quota_in_mb > 15000
- Dankzij de datumvergelijking met
CAST(DATE_SUB(CURRENT_DATE(), INTERVAL x DAY) AS STRING)
kunnen datums worden vergeleken met de beschikbare indeling van de waarde date. -
Deze query geldt ook voor Gmail, waar u een vergelijkbare waarde kunt vinden:
accounts.gmail_used_quota_in_mb
Praktische tips voor Gmail met BigQuery
- Zoek alleen naar de gegevens die u nodig heeft. In deze voorbeelden is een limiet van duizend resultaten gebruikt, maar u kunt uw eigen limiet instellen.
- Stel een periode in voor de zoekopdracht. Een typische periode is één dag.
Overeenkomst onderwerp
Weergave met berichtoverzichten voor maximaal 1000 resultaten die overeenkomen met een bepaald onderwerp
SELECT TIMESTAMP_MICROS(gmail.event_info.timestamp_usec) as timestamp,
gmail.message_info.subject,
gmail.message_info.source.address,
gmail.message_info.rfc2822_message_id
FROM your_dataset_id.activity
WHERE gmail.message_info.subject LIKE "%test%"
LIMIT 1000
Overeenkomst ontvanger
Het aantal verschillende berichten voor een bepaalde ontvanger
SELECT COUNT(DISTINCT gmail.message_info.rfc2822_message_id)
FROM your_dataset_id.activity d
WHERE
EXISTS(
SELECT 1 FROM d.gmail.message_info.destination WHERE destination.address = "[email protected]")
Overeenkomst ordening en ontvanger
Weergave met berichtoverzichten voor maximaal duizend resultaten die voldoen aan deze beide criteria:
- Een bepaalde ordening ('Gewijzigd', 'Geweigerd', 'In de quarantaine geplaatst')
- Een bepaalde ontvanger
SELECT TIMESTAMP_MICROS(gmail.event_info.timestamp_usec) as timestamp,
gmail.message_info.subject,
gmail.message_info.source.address as source,
destination.address as destination,
gmail.message_info.rfc2822_message_id
FROM your_dataset_id.activity d, d.gmail.message_info.destination
WHERE
destination.address = "[email protected]" AND
EXISTS(SELECT 1 FROM d.gmail.message_info.triggered_rule_info ri, ri.consequence
WHERE consequence.action = 17)
LIMIT 1000
Regelbeschrijving getriggerd
Weergave met berichtoverzichten voor maximaal 1000 resultaten waardoor de opgegeven regelbeschrijving is getriggerd
SELECT TIMESTAMP_MICROS(gmail.event_info.timestamp_usec) as timestamp,
gmail.message_info.subject,
gmail.message_info.source.address as source,
destination.address as destination,
gmail.message_info.rfc2822_message_id
FROM your_dataset_id.activity d, d.gmail.message_info.destination
WHERE
EXISTS(SELECT 1 FROM d.gmail.message_info.triggered_rule_info ri, ri.consequence
WHERE consequence.reason LIKE '%description%')
LIMIT 1000
Gemarkeerd als spam
Weergave met berichtoverzichten voor maximaal 1000 resultaten:
- Gemarkeerd als spam
- Voor een bepaalde ontvanger
- Wegens elke reden
SELECT TIMESTAMP_MICROS(gmail.event_info.timestamp_usec) as timestamp,
gmail.message_info.subject,
gmail.message_info.source.address as source,
destination.address as destination,
gmail.message_info.rfc2822_message_id
FROM your_dataset_id.activity d, d.gmail.message_info.destination
WHERE gmail.message_info.is_spam AND
destination.address = "[email protected]"
LIMIT 1000
Versleutelingsprotocol: niet versleuteld
Weergave met berichtoverzichten per versleutelingsprotocol: niet versleuteld
SELECT TIMESTAMP_MICROS(gmail.event_info.timestamp_usec) as timestamp,
gmail.message_info.subject,
gmail.message_info.source.address as source,
destination.address as destination,
gmail.message_info.rfc2822_message_id
FROM your_dataset_id.activity d, d.gmail.message_info.destination
WHERE gmail.message_info.connection_info.smtp_tls_state = 0
LIMIT 1000
Versleutelingsprotocol: alleen TLS
Weergave met berichtoverzichten per versleutelingsprotocol: alleen TLS
SELECT TIMESTAMP_MICROS(gmail.event_info.timestamp_usec) as timestamp,
gmail.message_info.subject,
gmail.message_info.source.address as source,
destination.address as destination,
gmail.message_info.rfc2822_message_id
FROM your_dataset_id.activity d, d.gmail.message_info.destination
WHERE gmail.message_info.connection_info.smtp_tls_state = 1
LIMIT 1000
Overeenkomst bericht-ID
Weergave met berichtoverzichten met een bepaalde bericht-ID (plaats < voor en > achter de bericht-ID)
SELECT TIMESTAMP_MICROS(gmail.event_info.timestamp_usec) as timestamp,
gmail.event_info.success,
gmail.event_info.elapsed_time_usec,
gmail.message_info.subject,
gmail.message_info.source.address as source,
gmail.message_info.source.service as source_service,
gmail.message_info.source.selector as source_selector,
destination.address as destination,
destination.service,
destination.selector as destination_selector,
gmail.message_info.rfc2822_message_id,
gmail.message_info.payload_size,
gmail.message_info.num_message_attachments,
gmail.message_info.connection_info.smtp_tls_state,
gmail.message_info.description
FROM your_dataset_id.activity d, d.gmail.message_info.destination
WHERE gmail.message_info.rfc2822_message_id = ""
LIMIT 1000
Ordening: Bericht weigeren
Bericht weigeren:
- Welke regel veroorzaakte dat het bericht werd geweigerd?
SELECT TIMESTAMP_MICROS(gmail.event_info.timestamp_usec) as timestamp,
gmail.message_info.subject,
gmail.message_info.source.address as source,
destination.address as destination,
gmail.message_info.rfc2822_message_id,
(SELECT ARRAY_AGG(consequence.reason)
FROM d.gmail.message_info.triggered_rule_info ri, ri.consequence)
FROM your_dataset_id.activity d, d.gmail.message_info.destination
WHERE gmail.message_info.rfc2822_message_id = "<message id>" AND
EXISTS(SELECT 1 FROM d.gmail.message_info.triggered_rule_info ri, ri.consequence
WHERE consequence.action = 17)
LIMIT 1000
Ordening: Bericht wijzigen
Bericht wijzigen:
- Welke regel zorgde dat het bericht werd gewijzigd?
- Welke subcategorie van wijzigingen (bijvoorbeeld kopteksten of onderwerp)?
SELECT TIMESTAMP_MICROS(gmail.event_info.timestamp_usec) as timestamp,
gmail.message_info.subject,
gmail.message_info.source.address as source,
destination.address as destination,
gmail.message_info.rfc2822_message_id,
(SELECT ARRAY_AGG((consequence.action, consequence.reason))
FROM d.gmail.message_info.triggered_rule_info ri, ri.consequence)
FROM your_dataset_id.activity d, d.gmail.message_info.destination
WHERE gmail.message_info.rfc2822_message_id = "<message id>" AND
EXISTS(SELECT 1 FROM d.gmail.message_info.triggered_rule_info ri, ri.consequence
WHERE consequence.action NOT IN (0, 17, 3))
LIMIT 1000
Bericht in quarantaine plaatsen
Welke regel heeft een bericht in quarantaine geplaatst?
SELECT TIMESTAMP_MICROS(gmail.event_info.timestamp_usec) as timestamp,
gmail.message_info.subject,
gmail.message_info.source.address as source,
destination.address as destination,
gmail.message_info.rfc2822_message_id,
(SELECT ARRAY_AGG(consequence.reason)
FROM d.gmail.message_info.triggered_rule_info ri, ri.consequence)
FROM your_dataset_id.activity d, d.gmail.message_info.destination
WHERE gmail.message_info.rfc2822_message_id = "<message id>" AND
EXISTS(SELECT 1 FROM d.gmail.message_info.triggered_rule_info ri, ri.consequence
WHERE consequence.action = 3)
LIMIT 1000
Query's samenstellen
Het aantal berichten dat voldoet aan een specifieke regel (genaamd 'rule description' (regelbeschrijving)) in de afgelopen 30 dagen:
SELECT
COUNT(gmail.message_info.rfc2822_message_id) AS message_cnt
FROM
`your_dataset_id.activity`,
UNNEST (gmail.message_info.triggered_rule_info) AS triggered_rule
WHERE
_PARTITIONTIME >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 30 DAY)
AND triggered_rule.rule_name LIKE "rule description"
Alle berichten zonder TLS-versleuteling weergeven die in de afgelopen dag zijn ontvangen:
SELECT gmail.message_info.subject,
gmail.message_info.rfc2822_message_id
FROM `your_dataset_id.activity`
WHERE
_PARTITIONTIME >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 30 DAY) AND
gmail.message_info.connection_info.smtp_tls_state = 0
De top tien van domeinen waarmee mijn account in de afgelopen dertig dagen heeft gemaild:
SELECT
COUNT(DISTINCT gmail.message_info.rfc2822_message_id) as message_cnt,
IF(gmail.message_info.is_policy_check_for_sender,
REGEXP_EXTRACT(gmail.message_info.source.address , "(@.*)"),
REGEXP_EXTRACT(destination.address , "(@.*)")) AS domain
FROM `your_dataset_id.activity` d, d.gmail.message_info.destination
WHERE
_PARTITIONTIME >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 30 DAY)
GROUP BY domain
ORDER BY message_cnt desc
LIMIT 10
De verhouding van dagelijks actieve gebruikers tot gebruikers die in de afgelopen 30 dagen actief waren in Gmail.
Dagelijks actieve gebruikers:
SELECT date,
gmail.num_1day_active_users
FROM api_project_name.dataset_name.usage
WHERE gmail.num_1day_active_users > 0
ORDER BY 1 DESC;
Gebruikers die in de afgelopen 7 dagen actief waren:
SELECT date,
gmail.num_7day_active_users
FROM api_project_name.dataset_name.usage
WHERE gmail.num_7day_active_users > 0
ORDER BY 1 DESC;
Gebruikers die in de afgelopen 30 dagen actief waren:
SELECT date,
gmail.num_30day_active_users
FROM api_project_name.dataset_name.usage
WHERE gmail.num_30day_active_users > 0
ORDER BY 1 DESC;
De 100 meest recente Gmail-logboekgebeurtenissen met minstens één classificatielabel dat aan het e-mailbericht is gekoppeld
SELECT
resource_details[OFFSET(0)].id AS MESSAGE_ID,
gmail.message_info.subject AS SUBJECT,
gmail.event_info.mail_event_type AS MAIL_EVENT_TYPE,
gmail.message_info.source.address AS SENDER,
resource_details[OFFSET(0)].applied_labels AS LABELS
FROM workspace_audit_logs.activity
WHERE gmail.event_info.mail_event_type > 0 and ARRAY_LENGTH(resource_details) > 0
ORDER by time_usec desc
LIMIT 100;
Alle beschikbare logboekgebeurtenissen voor een specifiek e-mailbericht
SELECT
gmail.event_info,
gmail.message_info,
resource_details
FROM workspace_audit_logs.activity
WHERE gmail.message_info.rfc2822_message_id = "<XYZ>"
ORDER by time_usec desc;
Wijzigingen in Google Groepen-lidmaatschappen en -gebruikersgedrag
SELECT TIMESTAMP_MICROS(time_usec) AS date,
event_name,
admin.group_email,
event_type,
email,
record_type,
admin.user_email,
admin.new_value,
admin.old_value,
admin.setting_name
FROM project_name.dataset_name.activity
WHERE `admin`.group_email IS NOT NULL
AND CONCAT(TIMESTAMP_MICROS(time_usec)) LIKE "%YYYY-MM-DD%"
ORDER BY 1 DESC
LIMIT
1000
Als u het tijdstempel JJJJ-MM-DD wilt, kunt u de eerste SELECT-instructie vervangen door:
EXTRACT(DATE FROM TIMESTAMP_MICROS(time_usec)) AS date,
De datums kunnen op de volgende manieren worden gefilterd in de WHERE-clausule:
SELECT TIMESTAMP_MICROS(time_usec) AS date,
event_name,
admin.group_email,
event_type,
email,
record_type,
admin.user_email,
admin.new_value,
admin.old_value,
admin.setting_name
FROM project_name.dataset_name.activity
WHERE `admin`.group_email IS NOT NULL
AND EXTRACT(DATE FROM TIMESTAMP_MICROS(time_usec)) > "2020-06-30"
AND EXTRACT(DATE FROM TIMESTAMP_MICROS(time_usec)) < "2020-08-31"
ORDER BY 1 DESC
LIMIT
1000
SELECT TIMESTAMP_MICROS(time_usec) AS date,
event_name,
admin.group_email,
event_type,
email,
record_type,
admin.user_email,
admin.new_value,
admin.old_value,
admin.setting_name
FROM project_name.dataset_name.activity
WHERE `admin`.group_email IS NOT NULL
AND TIMESTAMP_MICROS(time_usec) > TIMESTAMP("2020-07-21")
AND TIMESTAMP_MICROS(time_usec) < TIMESTAMP("2020-07-23")
ORDER BY 1 DESC
LIMIT
1000
Aantal videogesprekken en totale belminuten op datum
SELECT date, meet.num_calls, meet.total_call_minutes
FROM `api_project_name.dataset_name.usage`
WHERE meet.num_calls IS NOT NULL
ORDER BY date ASC
Dagelijks actieve gebruikers
SELECT date, meet.num_1day_active_users
FROM `api_project_name.dataset_name.usage`
WHERE meet.num_1day_active_users IS NOT NULL
ORDER BY date DESC
Gebruikers die in de afgelopen 30 dagen actief waren
SELECT date, meet.num_30day_active_users
FROM `api_project_name.dataset_name.usage`
WHERE meet.num_30day_active_users IS NOT NULL
ORDER BY date DESC
Getriggerde DLP-regels gesorteerd op naam, overeenkomende app en acties.
SELECT TIMESTAMP_MICROS(time_usec) AS date, rules.rule_name, rules.application,
rules.resource_title, rules.actions, rules.resource_owner_email,
rules.data_source, rules.matched_trigger
FROM api_project_name.dataset_name.activity
WHERE rules.rule_name IS NOT NULL
ORDER BY 1 DESC LIMIT 1000;
Het aantal keer dat een app van derden toegang heeft gekregen tot Google Drive.
SELECT token.client_id, scope, token.app_name, count(*) AS count
FROM api_project_name.dataset_name.activity
LEFT JOIN UNNEST(token.scope) AS scope
WHERE scope LIKE "%drive%"
GROUP BY 1,2,3 ORDER BY 4 DESC;
Uitgebreide informatie over mislukte inlogpogingen bij de Google Beheerdersconsole.
SELECT TIMESTAMP_MICROS(time_usec) AS date, email, ip_address,
event_name, login.login_type, login.login_failure_type
FROM api_project_name.dataset_name.activity
WHERE login.login_type IS NOT NULL
AND login.login_failure_type IS NOT NULL
AND event_type = "login"
ORDER BY date DESC;
Het schema kan veranderen. U vindt een uitgebreide, geüpdatete lijst met parameters en velden in de Reports API-documentatie.
U kunt filteren op datum als u query's uitvoert in de tabellen activity of usage. De manier waarop de datum wordt gepresenteerd verschilt tussen deze tabellen:
- In de tabel activity worden de tijdstempels opgeslagen in Unix-microseconden. Dit is een geheel getal dat u kunt omzetten naar een datum met de functie TIMESTAMP_MICROS().
- In de tabel usage worden de waarden voor date al in een datumnotatie weergegeven, dus u hoeft deze niet om te zetten.
Voor beide tabellen kunt u op de volgende manieren filteren op een specifieke datum (of periode).
De activity-tabel
Als u wilt filteren op een specifieke datum met de Unix Micros-structuur (tabel activity), kunt u de functie WHERE en de functie TIMESTAMP() opgeven om een eenvoudige vergelijking te maken met de operatoren groter dan (>) en kleiner dan (<):
SELECT TIMESTAMP_MICROS(time_usec) as date, record_type
FROM api_project_name.dataset_name.activity
WHERE TIMESTAMP_MICROS(time_usec) > TIMESTAMP("2020-07-01")
AND TIMESTAMP_MICROS(time_usec) < TIMESTAMP("2020-07-07")
ORDER BY 1 DESC LIMIT 1000
Dit concept plaatst een limiet op de invoerwaarde time_usec door de geretourneerde waarde van de functie TIMESTAMP_MICROS() te vergelijken met de geretourneerde waarde van de functie TIMESTAMP() met een datum die is toegevoegd als parameter met een tekenreekstype. Hierbij worden de standaarden in Timestamp Functions in Standard SQL (Tijdstempelfuncties in standaard SQL) gevolgd en er worden eenvoudige vergelijkingsoperatoren (>) en (<) gebruikt, samen met de extensie AND van de clausule WHERE om een specifieke periode af te sluiten.
De usage-tabel
SELECT date, meet.num_calls,
FROM api_project_name.dataset_name.usage
WHERE meet.num_calls IS NOT NULL
AND TIMESTAMP(date) > TIMESTAMP("2020-07-01")
AND TIMESTAMP(date) < TIMESTAMP("2020-07-07")
ORDER BY date DESC;
We kunnen de tekenreekstypewaarde date in de tabel opnemen in de functie TIMESTAMP() en de vergelijkingsoperatoren (>) en (<) gebruiken op dezelfde manier als in het eerste voorbeeld.
Als u bepaalde domeinen wilt uitsluiten van (of opnemen in) de queryresultaten, kunt u een filter voor het e-mailadres toepassen in de WHERE-clausule met jokertekens (%) om de domeinen te filteren.
Hoe u de instructies AND of OR gebruikt, hangt af van of u bepaalde resultaten eruit wilt filteren (uitsluiten) of wilt opnemen.
Bepaalde domeinen uitsluiten van de resultaten.
WHERE email NOT LIKE ("%@sub.%")
AND email NOT LIKE ("%@test.%")
Alleen bepaalde domeinen opnemen in de resultaten.
WHERE email LIKE ("%@sub.%")
OR email LIKE ("%@test.%")
Gebruik deze query om te bekijken welke pogingen uw gebruikers hebben gedaan om gevoelige gegevens te delen
SELECT TIMESTAMP_MICROS(time_usec) AS Date,
rules.resource_owner_email AS User,
rules.rule_name AS ruleName,
rules.rule_type AS ruleType,
rules.rule_resource_name AS ruleResourceName,
rules.resource_id AS resourceId,
rules.resource_title AS resourceTitle,
rules.resource_type AS resourceType,
rules.resource_owner_email AS resourceOwner,
CAST(recipients AS STRING) AS Recipients,
rules.data_source AS dataSource,
rules.actor_ip_address AS actorIpAddress,
rules.severity AS severity,
rules.scan_type AS scanType,
rules.matched_trigger AS matchedTriggers,
detect.display_name AS matchedDetectorsName,
detect.detector_id AS matchedDetectorsId,
detect.detector_type AS matchedDetectorsType,
triggers.action_type AS triggeredActions,
suppressors.action_type AS suppressedActions,
FROM api_project_name.dataset_name.activity
LEFT JOIN UNNEST(rules.resource_recipients) as recipients
LEFT JOIN UNNEST(rules.matched_detectors) as detect
LEFT JOIN UNNEST(rules.triggered_actions) as triggers
LEFT JOIN UNNEST(rules.suppressed_actions) as suppressors
WHERE rules.rule_name IS NOT NULL
AND triggers.action_type != "ALERT"
ORDER BY 1 DESC
LIMIT 1000;