Transfer Google Ads

BigQuery Data Transfer Service untuk Google Ads (sebelumnya dikenal sebagai Google AdWords) memungkinkan Anda menjadwalkan dan mengelola tugas pemuatan berulang secara otomatis untuk data pelaporan Google Ads.

Laporan yang didukung

BigQuery Data Transfer Service untuk Google Ads mendukung Google Ads API v14:

Untuk informasi tentang cara laporan Google Ads diubah menjadi tabel dan tabel virtual BigQuery Data Transfer Service, lihat Transformasi laporan Google Ads.

Untuk memetakan laporan Google Ads dengan informasi yang Anda lihat di UI Google Ads, lihat Memetakan laporan ke UI Google Ads.

Opsi pelaporan Support
Versi API yang didukung

v14

Jadwal

Harian, pada saat transfer pertama kali dibuat (default)

Anda dapat mengonfigurasi waktu pada hari itu.

Periode pemuatan ulang

7 hari terakhir (default)

Dapat dikonfigurasi hingga 30 hari

Snapshot Tabel Pencocokan diambil sekali sehari dan disimpan di partisi untuk tanggal terakhir dijalankan. Snapshot Tabel Pencocokan tidak diupdate untuk pengisian ulang atau untuk hari yang dimuat menggunakan jendela refresh.

Durasi pengisian ulang maksimum

Tak terbatas

Meskipun Google Ads tidak memiliki batas retensi data yang diketahui kecuali Laporan Performa Klik, BigQuery Data Transfer Service memiliki batas pada jumlah hari yang dapat diminta dalam satu permintaan pengisian ulang. Untuk informasi tentang pengisian ulang, lihat Menyiapkan pengisian ulang.

Jumlah ID Pelanggan per akun pengelola

8.000

BigQuery Data Transfer Service mendukung maksimum 8.000 ID Pelanggan untuk setiap akun pengelola (MCC) Google Ads.

Penyerapan data dari transfer Google Ads

Saat Anda mentransfer data dari Google Ads ke BigQuery, data dimuat ke dalam tabel BigQuery yang dipartisi berdasarkan tanggal. Partisi tabel tempat data dimuat sesuai dengan tanggal dari sumber data. Jika Anda menjadwalkan beberapa transfer untuk tanggal yang sama, BigQuery Data Transfer Service akan menimpa partisi untuk tanggal tertentu tersebut dengan data terbaru. Beberapa transfer pada hari yang sama atau menjalankan pengisian ulang tidak akan menghasilkan data duplikat, dan partisi untuk tanggal lain tidak akan terpengaruh.

Batasan

  • Frekuensi maksimum yang dapat dikonfigurasi untuk transfer Google Ads adalah sekali setiap 24 jam. Secara default, transfer dimulai saat Anda membuat transfer. Namun, Anda dapat mengonfigurasi waktu mulai transfer saat membuat transfer.
  • BigQuery Data Transfer Service tidak mendukung transfer inkremental selama transfer Google Ads. Saat Anda menentukan tanggal untuk transfer data, semua data yang tersedia untuk tanggal tersebut akan ditransfer.

Sebelum memulai

Sebelum membuat transfer Google Ads, lakukan langkah berikut:

Izin yang diperlukan

Pastikan orang yang melakukan transfer memiliki izin yang diperlukan berikut:

  • BigQuery Data Transfer Service:

    • Izin bigquery.transfers.update untuk membuat transfer
    • Izin bigquery.datasets.get dan bigquery.datasets.update pada set data target

    Peran IAM bawaan bigquery.admin mencakup izin bigquery.transfers.update, bigquery.datasets.update, dan bigquery.datasets.get. Untuk informasi selengkapnya tentang peran IAM dalam BigQuery Data Transfer Service, lihat Referensi kontrol akses.

  • Google Ads: Akses baca ke ID Pelanggan Google Ads atau akun pengelola (MCC) yang digunakan dalam konfigurasi transfer.

Membuat transfer data Google Ads

Untuk membuat transfer data untuk pelaporan Google Ads, Anda memerlukan ID pelanggan Google Ads atau akun pengelola (MCC). Untuk mendapatkan informasi tentang cara mengambil ID pelanggan Google Ads Anda, lihat Menemukan ID Pelanggan Anda.

Untuk membuat transfer data untuk pelaporan Google Ads, pilih salah satu opsi berikut:

Konsol

  1. Buka halaman BigQuery di konsol Google Cloud.

    Buka halaman BigQuery

  2. Klik Data transfers.

  3. Klik Create transfer.

  4. Di bagian Source type, untuk Source, pilih Google Ads.

  5. Di bagian Transfer config name, untuk Display name, masukkan nama untuk transfer, misalnya My Transfer. Nama transfer dapat berupa nilai apa pun yang memungkinkan Anda mengidentifikasi transfer jika perlu mengubahnya nanti.

  6. Di bagian Schedule options:

    • Untuk Repeat frequency, pilih opsi untuk seberapa sering transfer dijalankan. Jika Anda memilih Days, berikan waktu yang valid dalam UTC.

      • Jam
      • Hari
      • Sesuai permintaan
    • Jika ada, pilih Start now atau Start at set time dan masukkan tanggal mulai dan waktu proses.

  7. Di bagian Destination settings, untuk Dataset, pilih set data yang Anda buat untuk menyimpan data.

  8. Di bagian Data source details:

    1. Untuk Customer ID, masukkan ID pelanggan Google Ads Anda:

      Detail sumber Google Ads

    2. Opsional: Pilih opsi untuk mengecualikan item yang dihapus atau dinonaktifkan, dan menyertakan tabel yang baru untuk Google Ads.

    3. Opsional: Masukkan daftar tabel yang dipisahkan koma untuk disertakan, misalnya Campaign, AdGroup. Awali daftar ini dengan karakter - untuk mengecualikan tabel tertentu, misalnya -Campaign, AdGroup. Semua tabel disertakan secara default.

    4. Opsional: Pilih opsi untuk menyertakan tabel khusus untuk laporan Performa Maksimal. Untuk informasi selengkapnya tentang dukungan Performa Maksimal, lihat Dukungan Performa Maksimal.

    5. Opsional: Untuk Periode pemuatan ulang, masukkan nilai antara 1 dan 30.

  9. Di menu Service Account, pilih service account dari akun layanan yang terkait dengan project Google Cloud Anda. Anda dapat mengaitkan akun layanan dengan transfer Anda, bukan menggunakan kredensial pengguna. Untuk mengetahui informasi selengkapnya tentang cara menggunakan akun layanan dengan transfer data, lihat Menggunakan akun layanan.

  10. Opsional: Di bagian Notification options:

    • Klik tombol untuk mengaktifkan notifikasi email. Jika Anda mengaktifkan opsi ini, administrator transfer akan menerima notifikasi email jika proses transfer gagal.

    • Klik tombol untuk mengaktifkan notifikasi Pub/Sub. Untuk Select a Cloud Pub/Sub topic, pilih nama topik Anda atau klik Create a topic. Opsi ini mengonfigurasi notifikasi operasi Pub/Sub untuk transfer Anda.

      Notifikasi Google Ads

  11. Klik Save.

bq

Masukkan perintah bq mk dan berikan flag pembuatan transfer — --transfer_config. Flag berikut juga diperlukan:

  • --data_source
  • --target_dataset
  • --display_name
  • --params

Flag berikut bersifat opsional:

  • --project_id: Menentukan project yang akan digunakan. Jika flag tersebut tidak ditentukan, project default akan digunakan.
  • --table_filter: Menentukan tabel yang akan disertakan dalam transfer. Jika flag tidak ditentukan, semua tabel akan disertakan. Untuk menyertakan tabel tertentu saja, gunakan daftar nilai yang dipisahkan koma (misalnya, Ad, Campaign, AdGroup). Untuk mengecualikan tabel tertentu, awali nilai dengan tanda hubung (-) (misalnya, -Ad, Campaign, AdGroup).
  • --service_account_name: Menentukan akun layanan yang akan digunakan untuk autentikasi transfer Google Ads, bukan akun pengguna Anda.
bq mk \
--transfer_config \
--project_id=project_id \
--target_dataset=dataset \
--display_name=name \
--params='parameters' \
--data_source=data_source \
--table_filter=tables
--service_account_name=service_account_name

Dengan keterangan:

  • project_id adalah project ID Anda.
  • dataset adalah set data target untuk konfigurasi transfer.
  • name adalah nama tabel virtual untuk konfigurasi transfer. Nama transfer dapat berupa nilai apa pun yang memungkinkan Anda mengidentifikasi transfer jika perlu mengubahnya nanti.
  • parameters berisi parameter untuk konfigurasi transfer yang dibuat dalam format JSON. Contoh: --params='{"param":"param_value"}'. Untuk Google Ads, Anda harus memberikan parameter customer_id. Anda dapat memilih untuk menetapkan parameter exclude_removed_items ke true agar entity dan metrik yang dihapus atau dinonaktifkan tidak ditransfer.
  • data_source adalah sumber data — google_ads.
  • tables adalah daftar tabel yang dipisahkan koma yang akan disertakan atau dikecualikan dari transfer.
  • service_account_name adalah nama akun layanan yang digunakan untuk mengautentikasi transfer Anda. Akun layanan harus dimiliki oleh project_id yang sama dengan yang digunakan untuk membuat transfer dan harus memiliki semua izin yang diperlukan.

Misalnya, perintah berikut akan membuat transfer Google Ads bernama My Transfer menggunakan ID Pelanggan 123-123-1234 dan set data target mydataset. Transfer dibuat di project default:

bq mk \
--transfer_config \
--target_dataset=mydataset \
--display_name='My Transfer' \
--params='{"customer_id":"123-123-1234","exclude_removed_items":"true"}' \
--data_source=google_ads

Saat pertama kali menjalankan perintah ini, Anda akan menerima pesan seperti berikut:

[URL omitted] Please copy and paste the above URL into your web browser and follow the instructions to retrieve an authentication code.

Ikuti petunjuk dalam pesan, lalu tempel kode autentikasi di command line.

API

Gunakan metode projects.locations.transferConfigs.create dan berikan instance resource TransferConfig.

Java

Sebelum mencoba contoh ini, ikuti petunjuk penyiapan Java di Panduan memulai BigQuery menggunakan library klien. Untuk mengetahui informasi selengkapnya, lihat Dokumentasi referensi BigQuery Java API.

Untuk melakukan autentikasi ke BigQuery, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, lihat Menyiapkan autentikasi untuk library klien.

import com.google.api.gax.rpc.ApiException;
import com.google.cloud.bigquery.datatransfer.v1.CreateTransferConfigRequest;
import com.google.cloud.bigquery.datatransfer.v1.DataTransferServiceClient;
import com.google.cloud.bigquery.datatransfer.v1.ProjectName;
import com.google.cloud.bigquery.datatransfer.v1.TransferConfig;
import com.google.protobuf.Struct;
import com.google.protobuf.Value;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

// Sample to create ads(formerly AdWords) transfer config
public class CreateAdsTransfer {

  public static void main(String[] args) throws IOException {
    // TODO(developer): Replace these variables before running the sample.
    final String projectId = "MY_PROJECT_ID";
    String datasetId = "MY_DATASET_ID";
    // the customer_id only allows digits and hyphen ('-').
    String customerId = "012-345-6789";
    String refreshWindow = "100";
    Map<String, Value> params = new HashMap<>();
    params.put("customer_id", Value.newBuilder().setStringValue(customerId).build());
    params.put("refreshWindow", Value.newBuilder().setStringValue(refreshWindow).build());
    TransferConfig transferConfig =
        TransferConfig.newBuilder()
            .setDestinationDatasetId(datasetId)
            .setDisplayName("Your Ads Transfer Config Name")
            .setDataSourceId("adwords")
            .setParams(Struct.newBuilder().putAllFields(params).build())
            .build();
    createAdsTransfer(projectId, transferConfig);
  }

  public static void createAdsTransfer(String projectId, TransferConfig transferConfig)
      throws IOException {
    try (DataTransferServiceClient client = DataTransferServiceClient.create()) {
      ProjectName parent = ProjectName.of(projectId);
      CreateTransferConfigRequest request =
          CreateTransferConfigRequest.newBuilder()
              .setParent(parent.toString())
              .setTransferConfig(transferConfig)
              .build();
      TransferConfig config = client.createTransferConfig(request);
      System.out.println("Ads transfer created successfully :" + config.getName());
    } catch (ApiException ex) {
      System.out.print("Ads transfer was not created." + ex.toString());
    }
  }
}

Memicu transfer Google Ads secara manual

Saat Anda memicu transfer secara manual untuk Google Ads, snapshot Tabel Pencocokan diambil sekali sehari dan disimpan di partisi untuk tanggal terakhir dijalankan. Saat Anda memicu transfer manual, snapshot Tabel Pencocokan untuk tabel berikut tidak diupdate:

  • Ad
  • AdGroup
  • AdGroupAudience
  • AdGroupBidModifier
  • AdGroupAdLabel
  • AdGroupCriterion
  • AdGroupCriterionLabel
  • AdGroupLabel
  • AgeRange
  • Asset
  • AssetGroup
  • AssetGroupAsset
  • AssetGroupListingGroupFilter
  • AssetGroupSignal
  • Audience
  • BidGoal
  • Budget
  • Campaign
  • CampaignAudience
  • CampaignCriterion
  • CampaignLabel
  • Customer
  • Gender
  • Keyword
  • LocationBasedCampaignCriterion
  • ParentalStatus
  • Placement
  • Video

Dukungan Performa Maksimal

Konektor Google Ads memungkinkan Anda mengekspor data kampanye Performa Maksimal. Anda harus memilih kotak centang Sertakan Tabel Kampanye Performa Maksimal saat membuat transfer data, karena data Performa Maksimal tidak diekspor secara default.

Menyertakan data Performa Maksimal akan menghapus kolom ad_group dari tabel tertentu dan menyertakan tabel baru. Anda tidak dapat menyertakan kolom ad_group karena Google Ads API memfilter data Performa Maksimal.

Tabel berikut mengecualikan kolom terkait ad_group saat kotak Include PMax Campaign Tables dicentang:

  • GeoStats
  • GeoConversionStats
  • ShoppingProductConversionStats
  • ShoppingProductStats
  • LocationsUserLocationsStats

Tabel berikut ditambahkan jika kotak Include PMax Campaign Tables dicentang:

  • Asset
  • AssetGroup
  • AssetGroupAsset
  • AssetGroupListingGroupFilter
  • AssetGroupSignal
  • Audience
  • AssetGroupProductGroupStats
  • CampaignAssetStats

Dukungan untuk akun pengelola Google Ads

Pelanggan lama yang memiliki beberapa Transfer Google Ads khusus ID Pelanggan dianjurkan untuk menyiapkan satu Transfer Google Ads di tingkat Akun Pengelola (MCC), menjadwalkan pengisian ulang, dan menonaktifkan Transfer Google Ads khusus ID Pelanggan.

Menggunakan akun pengelola Google Ads akan memberikan beberapa manfaat dibandingkan penggunaan ID Pelanggan individual:

  • Anda tidak perlu lagi mengelola beberapa transfer untuk melaporkan beberapa ID Pelanggan.
  • Kueri lintas-pelanggan jauh lebih mudah ditulis karena semua ID Pelanggan disimpan dalam tabel yang sama.
  • Menggunakan MCC akan mengurangi masalah kuota pemuatan BigQuery Data Transfer Service karena beberapa ID Pelanggan dimuat di tugas yang sama.

Untuk informasi selengkapnya tentang akun pengelola Google Ads (MCC), lihat Menggunakan akun terkelola dan Tentang menautkan akun ke akun pengelola.

Contoh

Daftar berikut menunjukkan ID Pelanggan yang ditautkan ke akun pengelola Google Ads tertentu:

  • 1234567890 — akun pengelola root
    • 1234 — akun sub-pengelola
      • 1111 — ID Pelanggan
      • 2222 — ID Pelanggan
      • 3333 — ID Pelanggan
      • 4444 — ID Pelanggan
      • 567 — akun sub-pengelola
        • 5555 — ID Pelanggan
        • 6666 — ID Pelanggan
        • 7777 — ID Pelanggan
    • 89 — akun sub-pengelola
      • 8888 — ID Pelanggan
      • 9999 — ID Pelanggan
    • 0000 — ID Pelanggan

Setiap ID Pelanggan yang ditautkan ke akun pengelola akan muncul di setiap laporan. Untuk informasi selengkapnya mengenai struktur pelaporan Google Ads di BigQuery Data Transfer Service, lihat Transformasi laporan Google Ads.

Konfigurasi transfer untuk ID Pelanggan 1234567890

Konfigurasi transfer untuk akun pengelola root (ID Pelanggan 1234567890) akan menghasilkan proses transfer yang menyertakan ID Pelanggan berikut:

  • 1111 (melalui akun sub-pengelola 1234)
  • 2222 (melalui akun sub-pengelola 1234)
  • 3333 (melalui akun sub-pengelola 1234)
  • 4444 (melalui akun sub-pengelola 1234)
  • 5555 (melalui akun sub-pengelola 567 dan akun sub-pengelola 1234)
  • 6666 (melalui akun sub-pengelola 567 dan akun sub-pengelola 1234)
  • 7777 (melalui akun sub-pengelola 567 dan akun sub-pengelola 1234)
  • 8888 (melalui akun sub-pengelola 89)
  • 9999 (melalui akun sub-pengelola 89)
  • 0000 (ID Pelanggan individual)

Konfigurasi transfer untuk ID Pelanggan 1234

Konfigurasi transfer untuk akun sub-pengelola 123 (ID Pelanggan 1234) akan menghasilkan proses transfer yang menyertakan ID Pelanggan berikut:

  • 1111
  • 2222
  • 3333
  • 4444
  • 5555 (melalui akun sub-pengelola 567)
  • 6666 (melalui akun sub-pengelola 567)
  • 7777 (melalui akun sub-pengelola 567)

Konfigurasi transfer untuk ID Pelanggan 567

Konfigurasi transfer untuk akun sub-pengelola 567 (ID Pelanggan 567) akan menghasilkan proses transfer yang menyertakan ID Pelanggan berikut:

  • 5555
  • 6666
  • 7777

Konfigurasi transfer untuk ID Pelanggan 89

Konfigurasi transfer untuk akun sub-pengelola 89 (ID Pelanggan 89) akan menghasilkan proses transfer yang menyertakan ID Pelanggan berikut:

  • 8888
  • 9999

Konfigurasi transfer untuk ID Pelanggan 0000

Konfigurasi transfer untuk ID Pelanggan 0000 akan menghasilkan proses transfer yang hanya menyertakan ID Pelanggan individual:

  • 0000

Memigrasikan data Google Ads ke MCC

Untuk memigrasikan data Google Ads yang ada di BigQuery Data Transfer Service ke struktur MCC, Anda dapat menyiapkan pengisian ulang untuk menambahkan data yang sudah ada ke tabel yang dibuat oleh konfigurasi transfer yang ditautkan ke akun pengelola. Perhatikan bahwa saat Anda menjadwalkan pengisian ulang, tabel pencocokan tidak akan diupdate.

Memecahkan masalah penyiapan transfer Google Ads

Jika Anda mengalami masalah saat menyiapkan transfer, lihat Masalah transfer Google Ads di bagian Memecahkan masalah konfigurasi transfer.

Membuat kueri terhadap data

Saat data Anda ditransfer ke BigQuery Data Transfer Service, data tersebut ditulis ke tabel berpartisi berdasarkan waktu penyerapan. Untuk informasi selengkapnya, lihat Pengantar tabel berpartisi.

Jika membuat kueri tabel secara langsung, bukan menggunakan tabel virtual yang dihasilkan secara otomatis, Anda harus menggunakan kolom semu _PARTITIONTIME dalam kueri. Untuk informasi selengkapnya, lihat Membuat kueri tabel berpartisi.

Kueri contoh Google Ads

Anda dapat menggunakan kueri contoh Google Ads berikut untuk menganalisis data yang ditransfer. Anda juga dapat menggunakan kueri dalam alat visualisasi seperti Looker Studio. Kueri ini disediakan untuk membantu Anda mulai membuat kueri data Google Ads dengan BigQuery Data Transfer Service. Untuk pertanyaan tambahan mengenai apa yang dapat Anda lakukan dengan laporan ini, hubungi perwakilan teknis Google Ads Anda.

Di setiap kueri berikut, ganti dataset dengan nama set data Anda. Ganti customer_id dengan ID Pelanggan Google Ads Anda.

Jika membuat kueri tabel secara langsung, bukan menggunakan tabel virtual yang dihasilkan secara otomatis, Anda harus menggunakan kolom semu _PARTITIONTIME dalam kueri. Untuk informasi selengkapnya, lihat Membuat kueri tabel berpartisi.

Performa kampanye

Contoh kueri berikut menganalisis performa kampanye Google Ads selama 30 hari terakhir.

Konsol

SELECT
  c.customer_id,
  c.campaign_name,
  c.campaign_status,
  SUM(cs.metrics_impressions) AS Impressions,
  SUM(cs.metrics_interactions) AS Interactions,
  (SUM(cs.metrics_cost_micros) / 1000000) AS Cost
FROM
  `DATASET.ads_Campaign_CUSTOMER_ID` c
LEFT JOIN
  `DATASET.ads_CampaignBasicStats_CUSTOMER_ID` cs
ON
  (c.campaign_id = cs.campaign_id
  AND cs._DATA_DATE BETWEEN
  DATE_ADD(CURRENT_DATE(), INTERVAL -31 DAY) AND DATE_ADD(CURRENT_DATE(), INTERVAL -1 DAY))
WHERE
  c._DATA_DATE = c._LATEST_DATE
GROUP BY
  1, 2, 3
ORDER BY
  Impressions DESC

bq

  bq query --use_legacy_sql=false '
  SELECT
    c.customer_id,
    c.campaign_name,
    c.campaign_status,
    SUM(cs.metrics_impressions) AS Impressions,
    SUM(cs.metrics_interactions) AS Interactions,
    (SUM(cs.metrics_cost_micros) / 1000000) AS Cost
  FROM
    `DATASET.ads_Campaign_CUSTOMER_ID` c
  LEFT JOIN
    `DATASET.ads_CampaignBasicStats_CUSTOMER_ID` cs
  ON
    (c.campaign_id = cs.campaign_id
    AND cs._DATA_DATE BETWEEN
    DATE_ADD(CURRENT_DATE(), INTERVAL -31 DAY) AND DATE_ADD(CURRENT_DATE(), INTERVAL -1 DAY))
  WHERE
    c._DATA_DATE = c._LATEST_DATE
  GROUP BY
    1, 2, 3
  ORDER BY
    Impressions DESC'

Jumlah kata kunci

Contoh kueri berikut menganalisis kata kunci berdasarkan kampanye, grup iklan, dan status kata kunci. Kueri ini menggunakan fungsi KeywordMatchType. Jenis pencocokan kata kunci membantu menentukan penelusuran mana yang dapat memicu iklan Anda. Untuk informasi selengkapnya tentang opsi pencocokan kata kunci, lihat Tentang opsi pencocokan kata kunci.

Konsol

  SELECT
    c.campaign_status AS CampaignStatus,
    a.ad_group_status AS AdGroupStatus,
    k.ad_group_criterion_status AS KeywordStatus,
    k.ad_group_criterion_keyword_match_type AS KeywordMatchType,
    COUNT(*) AS count
  FROM
    `DATASET.ads_Keyword_CUSTOMER_ID` k
    JOIN
    `DATASET.ads_Campaign_CUSTOMER_ID` c
  ON
    (k.campaign_id = c.campaign_id AND k._DATA_DATE = c._DATA_DATE)
  JOIN
    `DATASET.ads_AdGroup_CUSTOMER_ID` a
  ON
    (k.ad_group_id = a.ad_group_id AND k._DATA_DATE = a._DATA_DATE)
  WHERE
    k._DATA_DATE = k._LATEST_DATE
  GROUP BY
    1, 2, 3, 4

bq

  bq query --use_legacy_sql=false '
  SELECT
    c.campaign_status AS CampaignStatus,
    a.ad_group_status AS AdGroupStatus,
    k.ad_group_criterion_status AS KeywordStatus,
    k.ad_group_criterion_keyword_match_type AS KeywordMatchType,
    COUNT(*) AS count
  FROM
    `DATASET.ads_Keyword_CUSTOMER_ID` k
  JOIN
    `DATASET.ads_Campaign_CUSTOMER_ID` c
  ON
    (k.campaign_id = c.campaign_id AND k._DATA_DATE = c._DATA_DATE)
  JOIN
    `DATASET.ads_AdGroup_CUSTOMER_ID` a
  ON
    (k.ad_group_id = a.ad_group_id AND k._DATA_DATE = a._DATA_DATE)
  WHERE
    k._DATA_DATE = k._LATEST_DATE
  GROUP BY
    1, 2, 3, 4'