Bu özelliğin desteklendiği sürümler: Frontline Standard; Enterprise Standard ve Enterprise Plus; Education Standard ve Education Plus; Enterprise Essentials Plus. Sürümünüzü karşılaştırın
Bu makale, BigQuery'den alabileceğiniz genel raporlar için örnek sorgular içerir. Bu sorgu örneklerinde, eski SQL'in bulunduğu varsayılır. api_project_name.dataset_name
ifadesini kendi proje adınız ve veri kümesi adınızla değiştirin.
BigQuery verilerini sorgulama hakkında daha fazla bilgi edinin.
Gmail günlük alanları ve anlamları için BigQuery'deki Gmail etkinlik günlükleri şeması başlıklı makaleye bakın.
Örnek sorgular
HesaplarYönetici hesapları ile yetki verilen hesapların sayısı ve devre dışı bırakılan, kilitlenen ve tarihe göre askıya alınan hesapların sayısı
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;
Bir yönetici tarafından en sık yapılan işlemler
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;
Belirli bir alandaki süper yöneticilerin sayısını bulma
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;
Yalnızca standart SQL
Google Takvim'de günlük etkin kullanıcı sayısının, 30 gün boyunca etkin olan kullanıcı sayısına oranı. Bu örnekte, birden çok tablo sorgulanır.
Günlük etkin kullanıcı sayısı
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
Son 30 gün içinde etkin olan kullanıcı sayısı
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;
Türe göre takvim etkinliklerinin sayısı
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;
Paylaşılan Google Drive öğelerinin, paylaşım yöntemine göre gruplandırılmış halde sayısı
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;
Dosya kimliği, başlık, sahip ve tür. Belirli bir zaman aralığında harici olarak paylaşılan dosyaların sayısı.
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;
Paylaşım izni değişiklikleri ve sonuçları. Dosya görünürlüğündeki değişikliğe hangi izin değişikliklerinin neden olduğunu anlamanızı sağlar.
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";
Dosya türüne göre gruplandırılmış etkinlik türleri. Dosya türüne göre benimseme raporu için kullanışlıdır.
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;
Her ortak Drive için etkinlik türü ve adı
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;
Alanınız dışından kullanıcılarla ilgili bilgiler
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;
Harici kullanıcılar için hangi izin değişikliklerinin ne zaman yapıldığı
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;
Depolama alanı izlemeyle ilgili bilgiler
Belirlenmiş bir eşikle (AND accounts.drive_used_quota_in_mb > 0
ibaresiyle tanımlanır) X üzerinde Drive depolama alanı kullanan kullanıcılar hakkında rapor oluşturmak için kullanışlıdır.
Bu sorgu, planlanmış bir sorgu olarak tanımlanabilir ya da periyodik olarak çağrılabilir (örneğin API kullanılarak).
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;
Notlar:
- Bu değer, müşterinin ayarladığı filtreyle eşleşecek şekilde değiştirilebilir. Örneğin, 15 GB'tan fazla:
AND accounts.drive_used_quota_in_mb > 15000
CAST(DATE_SUB(CURRENT_DATE(), INTERVAL x DAY) AS STRING)
ile tarih karşılaştırması, tarih değerindeki mevcut biçimle tarih karşılaştırması yapılmasına olanak tanır.-
Bu sorgu, benzer bir değer bulabileceğimiz Gmail için de geçerlidir:
accounts.gmail_used_quota_in_mb
BigQuery ile Gmail için en iyi uygulamalar
- Yalnızca ihtiyacınız olan verileri sorgulayın. Buradaki örneklerde 1.000 eşleşme sınırı vardır, ancak kendi sınırınızı belirlemeniz de mümkündür.
- Sorgularınız için bir zaman dilimi ayarlayın. Genel olarak bir günlük zaman dilimi kullanılır.
Konu eşleşmesi
Belirli bir konuyla eşleşen 1.000'e kadar kaydın ileti özeti görünümü
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
Alıcı eşleşmesi
Belirtilen bir alıcı için farklı iletilerin sayısı
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 = "recipient@example.com")
Elden çıkarma işlemi ve alıcı eşleşmesi
Aşağıdaki sorguların ikisiyle de eşleşen 1.000'e kadar kayıt için ileti özeti görünümü:
- Belirtilen elden çıkarma işlemi (Değiştir, Reddet, Karantinaya al)
- Belirtilen alıcı
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 = "recipient@example.com" AND
EXISTS(SELECT 1 FROM d.gmail.message_info.triggered_rule_info ri, ri.consequence
WHERE consequence.action = 17)
LIMIT 1000
Kural açıklaması tetiklendi
Belirtilen kural açıklaması tetiklenen 1.000'e kadar kayıt için ileti özeti görünümü
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
Spam olarak işaretlendi
1.000'e kadar kayıt için ileti özeti görünümü:
- Spam olarak işaretlendi
- Belirtilen alıcı için
- Tüm nedenler için
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 = "recipient@example.com"
LIMIT 1000
Şifreleme protokolü (şifrelenmemiş)
Şifreleme protokolüne göre ileti özeti görünümü (şifrelenmemiş)
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
Şifreleme protokolü (yalnızca TLS)
Şifreleme protokolüne göre ileti özeti görünümü (yalnızca 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
İleti kimliği eşleşmesi
Belirli bir ileti kimliği için ileti ayrıntıları görünümü (mesaj kimliğini "<>" içine alın)
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
Elden çıkarma: İletiyi reddet
İletiyi reddet:
- Hangi kural nedeniyle reddetme kararı verildi?
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
Elden çıkarma: İletiyi değiştir
İletiyi değiştir:
- Hangi kural nedeniyle değişiklik yapıldı?
- Hangi değiştirme alt kategorisi (ör. üstbilgi veya konu) kullanılıyor?
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
İletiyi karantinaya al
Hangi kural nedeniyle ileti karantinaya alındı?
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
Bileşik sorgular
Son 30 gün içinde belirli bir kural tarafından ("kural açıklaması" adlı kural) yakalanan tüm iletilerin sayısı:
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"
Son günde TLS şifrelemesi olmadan alınan tüm iletileri listeler:
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
Son 30 gün içinde hesabımın en çok posta alışverişi yaptığı 10 alanı listeler:
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
Gmail'de günlük etkin kullanıcı sayısının, 30 gün boyunca etkin olan kullanıcı sayısına oranı
Günlük etkin kullanıcı sayısı:
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;
Son 7 gün içinde etkin kullanıcı sayısı:
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;
Son 30 gün içinde etkin olan kullanıcı sayısı:
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;
Google Grubu üyelik değişiklikleri ve kullanıcı davranışı
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
YYYY-AA-GG zaman damgası kullanmak istiyorsanız ilk SELECT ifadesi şununla değiştirilebilir:
EXTRACT(DATE FROM TIMESTAMP_MICROS(time_usec)) AS date,
Tarihler, WHERE ibaresinde aşağıdaki yöntemlerden biriyle filtrelenebilir:
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
Tarihe göre görüntülü görüşme sayısı ve toplam görüşme dakikası
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
Günlük etkin kullanıcı sayısı
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
Son 30 gün içinde etkin olan kullanıcı sayısı
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
Ada, eşleşen uygulamaya ve işlemlere göre tetiklenen Veri Kaybını Önleme kurallarının sayısı
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;
Bir üçüncü taraf uygulamasının Google Drive'a erişmesine kaç kez izin verildiği
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;
Google Yönetici konsolunda başarısız oturum açma işlemleriyle ilgili ayrıntılı bilgi
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;
Şema değişebilir. Parametre ve alanların güncel, tam listesini Reports API dokümanlarında bulabilirsiniz.
Etkinlik veya kullanım tablolarını sorgularken tarihe göre filtreleme yapabilirsiniz. Her iki yöntem de tarihi sunarken farklı biçimler kullanır:
- Etkinlik tablosunda zaman damgaları Unix mikrosaniye cinsinden depolanır. Bu, TIMESTAMP_MICROS() işleviyle tarihe dönüştürülebilen bir tam sayı değeridir (rakamdır).
- Kullanım tablosunda tarih değerleri tarih biçiminde olduğundan böyle bir dönüştürmeye gerek yoktur.
Her iki tabloda da, aşağıdaki yöntemlerden birini kullanarak belirli bir tarihe (veya tarih aralığına) göre filtreleme yapmayı tercih edebilirsiniz.
Etkinlik tablosu
Unix Micros (etkinlik tablosu) yapısıyla belirli bir tarihe göre filtrelemek için WHERE ibaresini ve TIMESTAMP() işlevini tanımlayarak büyüktür (>) ve küçüktür (<) operatörleriyle basit bir karşılaştırma yapabilirsiniz:
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
Buradaki amaç, girilen time_usec değerine sınır getirmektir. Bunun için TIMESTAMP_MICROS() işlevinden döndürülen değer, dize türü parametresi olarak eklenen bir tarihle birlikte TIMESTAMP() işlevinden döndürülen değerle karşılaştırılır. Bu kod, Timestamp functions in Standard SQL (Standart SQL'deki zaman damgası İşlevleri) sayfasında anlatılan standartlara uygundur ve hem basit karşılaştırma operatörleri olan (>) ve (<) işaretlerini hem de WHERE ibaresinin AND uzantısını kullanarak belli bir zaman aralığının sınırlarını belirler.
Kullanım tablosu
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;
Tabloda mevcut olan tarih dize türü değerini TIMESTAMP() işlevine sunabilir ve (>) ile (<) karşılaştırma operatörlerini ilk örnektekiyle aynı şekilde kullanabiliriz.
Belirli alan adlarını sorgu sonuçlarınıza dahil etmek veya hariç tutmak için, alan adını filtrelemek üzere joker karakter (%) kullanarak WHERE ibaresinde e-posta adresi için bir filtre uygulayın.
AND veya OR ifadesini kullanma biçiminiz, belirli sonuçları filtreleme (hariç tutma) veya dahil etme yönündeki tercihinize bağlı olarak farklılık gösterir.
Belirli alanları sonuçlardan hariç tutma
WHERE email NOT LIKE ("%@sub.%")
AND email NOT LIKE ("%@test.%")
Sonuçlara yalnızca belirli alanları dahil etme
WHERE email LIKE ("%@sub.%")
OR email LIKE ("%@test.%")
Kullanıcıların hassas verileri paylaşma girişimlerini izlemek için bu sorguyu kullanın
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;