Bagikan melalui


Menerapkan penghitungan berbasis waktu di Power BI

Power BI menawarkan beberapa alat untuk melakukan penghitungan berbasis waktu, yang mengandalkan tabel tanggal otomatis atau tabel tanggal yang Anda tambahkan.

Sebaiknya gunakan kecerdasan waktu berbasis kalender (pratinjau) karena memberikan performa terbaik dan fleksibilitas tertinggi untuk memenuhi kalender apa pun.

Tabel ini membandingkan tiga alat yang disediakan:

Tool Upaya penyiapan diperlukan Kemudahan manajemen Fleksibilitas Catatan
Tanggal/waktu otomatis hampir nol keras rendah Meningkatkan ukuran model akibat penciptaan beberapa tabel tanggal yang tersembunyi
Kecerdasan waktu klasik medium mudah rendah Memerlukan pembuatan tabel tanggal, menggunakan asumsi kalender Gregorian atau kalender Gregorian yang telah diubah, mengalami masalah kinerja dalam beberapa skenario tertentu.
Inteligensi waktu berbasis kalender tinggi medium tinggi Disarankan untuk membuat tabel tanggal, fleksibilitas tertinggi, performa terbaik, tetapi peningkatan biaya penyiapan

Nota

Kami menyarankan untuk tidak menggunakan teknik kecerdasan waktu alternatif, terutama yang melibatkan penambahan kolom tambahan ke tabel tanggal untuk menghitung offset kecuali untuk kasus penggunaan tertentu. Meskipun pendekatan ini dapat menarik bagi pemula karena rumus DAX mereka yang mudah, mereka cenderung melambungkan model semantik secara tidak perlu. Kembung ini dapat menyebabkan refresh data yang lebih lambat dan performa laporan yang berkurang saat himpunan data tumbuh.

Tanggal/waktu otomatis

Fitur tanggal/waktu otomatis secara otomatis membuat tabel tanggal tersembunyi untuk setiap bidang tanggal dalam model data Anda. Untuk informasi selengkapnya tentang perilaku otomatis ini, lihat Menerapkan tanggal/waktu otomatis di Power BI Desktop.

Nota

Meskipun tanggal/waktu otomatis adalah opsi yang nyaman untuk model sederhana, tidak disarankan untuk skenario yang lebih kompleks dan model yang lebih besar. Untuk model tersebut, lebih baik membuat tabel khusus untuk lebih banyak fleksibilitas.

Menambahkan tabel tanggal

Untuk sebagian besar model, disarankan untuk menambahkan tabel tanggal (atau lebih dalam beberapa skenario). Banyak analis data lebih suka membuat tabel tanggal mereka sendiri, yang baik-baik saja.

Ada beberapa cara untuk membuat tabel seperti itu, termasuk:

Opsi mana yang terbaik untuk Anda tergantung pada berbagai faktor dan berada di luar cakupan tutorial ini.

Bekerja dengan perhitungan berbasis waktu

Dengan asumsi Anda tidak menggunakan tanggal/waktu otomatis, ada dua cara alternatif untuk bekerja dengan fungsi Inteligensi waktu di Power BI untuk melakukan penghitungan berbasis waktu:

  • Kecerdasan waktu klasik. Pilihan termudah dan berfungsi dengan baik untuk kalender Gregorian atau yang digeser tetapi memiliki fleksibilitas terbatas untuk kalender berstruktur berbeda atau penghitungan berbasis minggu.
  • Inteligensi waktu berbasis kalender (pratinjau). Opsi yang lebih baru, tetapi memerlukan sedikit usaha lebih untuk mendisain. Namun, ini juga memberi Anda performa yang lebih baik, lebih banyak fleksibilitas untuk bekerja dengan kalender non-Gregorian dan kemampuan untuk melakukan perhitungan berbasis mingguan.

Nota

Anda perlu mengatur tabel Anda sebagai tabel tanggal untuk skenario tertentu.

Analisis Waktu Klasik

Opsi ini mengharuskan Anda memiliki tabel tanggal dalam model Anda dan mengaturnya dengan sesuai. Setelah itu, Anda dapat menggunakan fungsi inteligensi waktu dan merujuk ke tabel tanggal Anda. Misalnya, jika Anda memiliki tabel tanggal yang disebut Tanggal dalam model yang Anda tetapkan sebagai tabel tanggal, yang berisi kolom Tanggal, maka Anda bisa menggunakan:

SAMEPERIODLASTYEAR ( 'Date'[Date] )

Meskipun ini adalah pendekatan yang cepat dan mudah, ada banyak kelemahan dibandingkan dengan pendekatan berbasis kalender:

  • ini mengharuskan Anda mengatur tabel tanggal
  • ini hanya berfungsi dengan model yang memiliki setidaknya satu tabel tanggal khusus
  • kolom tanggal yang digunakan seharusnya tidak memiliki tanggal yang hilang antara tanggal pertama dan terakhir. Jika ada tanggal yang hilang antara tanggal pertama dan terakhir, kesalahan akan muncul.
  • ini kurang fleksibel karena dioptimalkan untuk kalender Gregorian atau Gregorian yang digeser, seperti tahun fiskal yang dimulai pada 1 Juli tetapi masih mengikuti kalender Gregorian
  • tidak menyediakan perhitungan berbasis mingguan
  • dalam skenario tertentu, perhitungan berbasis waktu tidak berkinerja baik.

Nota

Kami sarankan Anda menggunakan pendekatan berbasis kalender yang disempurnakan .

Inteligensi waktu berbasis kalender (pratinjau)

Kalender adalah definisi metadata yang ditambahkan ke tabel untuk menunjukkan kolom mana dari tabel tersebut yang mewakili atribut waktu apa. Anda dapat menentukan satu atau beberapa kalender pada tabel apa pun dalam model Anda. Setelah menentukan kalender dalam model, Anda dapat merujuknya dalam fungsi inteligensi waktu Anda. Misalnya, berikut cara menghitung total tahun hingga tanggal Penjualan menggunakan kalender Fiskal yang ditentukan:

TOTALYTD ( [Sales], 'Fiscal Calendar' )

Manfaat kecerdasan waktu berbasis kalender

Manfaat utama kecerdasan waktu berbasis kalender adalah:

Bekerja dengan kalender apa pun

Kalender memberi Anda fleksibilitas penuh untuk memutuskan cara membagi waktu dalam tahun, kuartal, bulan, dan minggu. Misalnya, Anda dapat menentukan kalender yang mengikuti pola ini:

  • Gregorian
  • Perpindahan Kalender Gregorian
  • Ritel (445, 454, 544 pola desain)
  • 13 bulan
  • Bulan

Kemungkinannya tidak ada habisnya karena tidak ada asumsi bawaan dari Power BI tentang bagaimana kalender Anda disusun. Kecerdasan waktu berdasarkan kalender tidak membuat perkiraan mengenai tanggal dasar. Semua perhitungan menggunakan data yang mendasari apa adanya.

Tanggal jarang

Kecerdasan waktu klasik mengharuskan kolom tanggal yang disediakan lengkap - jika ada tanggal yang hilang antara tanggal pertama dan terakhir, akan timbul kesalahan. Fungsi inteligensi waktu berbasis kalender tidak memiliki persyaratan seperti itu. Sebaliknya, mereka memproses tanggal tanpa perubahan. Meskipun kami masih merekomendasikan memiliki tabel kalender lengkap dan khusus, Anda tidak lagi diharuskan memilikinya. Misalnya, jika semua toko ritel Anda ditutup selama akhir pekan, Anda dapat melewati hari-hari akhir pekan karena mereka tidak memiliki penjualan apa pun. Dengan asumsi akhir pekan Anda adalah Sabtu dan Minggu, Anda sekarang dapat menggunakan PREVIOUSDAY dengan kalender berdasarkan tabel yang tidak memiliki entri untuk akhir pekan untuk melompat dari Senin langsung ke Jumat.

Perhitungan berbasis mingguan

Inteligensi waktu berbasis kalender secara langsung menyediakan fungsi DAX yang beroperasi dengan granularitas mingguan. Misalnya, total mingguan hingga saat ini dapat dihitung secara langsung menggunakan TOTALWTD:

TOTALWTD ( Expr, CalendarName )

Peningkatan performa

Beberapa skenario dapat menunjukkan peningkatan performa saat membandingkan fungsi kecerdasan waktu berbasis kalender dengan rekan klasiknya. Misalnya, visual yang dikelompokkan menurut minggu dan melakukan perhitungan tahun ke tanggal menggunakan TOTALYTD ( ..., CalendarName ) umumnya harus dijalankan lebih cepat daripada jika rekan klasiknya, TOTALYTD ( ..., TableName[DateColumnName] ), digunakan. Untuk wawasan tentang mengapa hal ini mungkin terjadi, lihat bagian Kliring konteks .

Mengaktifkan pratinjau Inteligensi Waktu DAX yang disempurnakan

Untuk memulai, Pertama-tama Anda perlu mengaktifkan fitur pratinjau Inteligensi Waktu DAX yang Ditingkatkan .

  1. Di Power BI Desktop, buka Opsi File > dan pengaturan > Opsi > Pratinjau fitur.
  2. Pilih pratinjau Inteligensi Waktu DAX yang Ditingkatkan .
  3. Pilih OK
  4. Mulai ulang Power BI Desktop

Mengelola kalender

Untuk mengelola kalender, klik kanan tabel yang berisi kalender atau tempat Anda ingin menentukan kalender dan memilih opsi Kalender atau pilih Opsi kalender di pita Alat tabel setelah memilih tabel:

Cuplikan layar memperlihatkan titik entri untuk membuka Opsi Kalender pada tabel.

Atau Anda dapat menggunakan alat eksternal atau tampilan TMDL untuk menentukan kalender. Untuk informasi selengkapnya, lihat skrip TMDL.

Kalender juga ditampilkan di penjelajah model di bawah tabel tempat kalender ditentukan:

Cuplikan layar memperlihatkan penjelajah model untuk model semantik. Simpul tabel Tanggal diperluas dan kalender disorot.

Halaman pengaturan kalender

Layar opsi kalender memperlihatkan kalender yang ditentukan pada tabel terpilih. Di sini Anda dapat:

  • membuat kalender baru dengan memilih Kalender baru
  • edit kalender yang sudah ada dengan memilih Edit
  • hapus kalender yang sudah ada dengan memilih Hapus
  • atur tabel sebagai tabel tanggal dengan memilih Tandai sebagai tabel tanggal

Cuplikan layar memperlihatkan Opsi Kalender pada tabel.

Menetapkan kategori kolom

Menentukan kalender melibatkan pemberian nama dan menetapkan kolom ke kategori. Setiap kategori mewakili satuan waktu dan kategori kolom tertentu tersedia. Anda harus setidaknya menetapkan satu kolom utama ke kategori untuk menyimpan kalender Anda. Setiap kategori harus memiliki kolom utama dan dapat memiliki nol atau lebih kolom terkait. Setiap kali kolom yang terkait dengan kategori berada dalam konteks Power BI tahu unit waktu apa yang mereka sajikan. Selain itu, untuk beberapa fungsi seperti TOTALMTD Power BI menggunakan kolom utama yang dipetakan ke kategori yang relevan dalam kalender yang direferensikan untuk melakukan penghitungan yang diminta. Untuk menetapkan kolom ke kategori, pilih kategori dari menu Tambahkan kategori lalu pilih kolom terkait primer dan opsional.

Cuplikan layar memperlihatkan layar pembuatan dan pengeditan kalender.

Kategori kolom yang tersedia

Tabel berikut ini memperlihatkan kategori yang tersedia. Tabel ini juga memberikan contoh nilai dan kardinalitas untuk kalender Gregorian.

Kategori dibagi menjadi dua grup:

  • Selesai. Data dalam kolom yang ditetapkan ke Kategori lengkap sudah cukup untuk mengidentifikasi periode waktu secara unik.
  • Sebagian. Data dalam kolom yang ditetapkan ke Kategori parsial tidak cukup untuk mengidentifikasi periode waktu secara unik.
Kategori Description Tipe Contoh kardinalitas dalam kalender Gregorian Contoh nilai kolom dalam kalender Gregorian
Tahun Tahun Selesai Y = jumlah tahun 2024, 2025
Kuartal Kuartal yang mencakup tahun Selesai 4*Y Kuartal 1 2024, Kuartal 2 2025
Triwulan Tahun Kuartal tahun ini Partial 4 Tahun Kuartal 1, YQ1, Q1, Kuartal 2
Bulan Bulan termasuk tahun Selesai 12*Y ≤ value ≤ 13*Y Januari 2023, Februari 2024
Bulan dalam Tahun Bulan dalam setahun Partial 12 Januari, Tahun Bulan 11, YM11, M11, 11
Bulan Kuartal Bulan kuartal Partial 3 1, QM2
Minggu Minggu beserta tahunnya Selesai 52 ≤ value ≤ 53 Minggu 50 2023, W50-2023, 2023-W50
Minggu dalam Tahun Minggu dalam setahun Partial 52 Minggu 50, W50, 50
Minggu Kuartal Minggu kuartal Partial 13 Pekan Kuartal 10, QW10, 10
Minggu Dalam Sebulan Minggu dalam sebulan Partial 5 Minggu ke-2 Bulan, MW2, 2
Tanggal Tanggal Selesai 365*Y ≤ value ≤ 366*Y 12/31/2025
Hari Dalam Setahun Hari dalam setahun Partial 365 ≤ value ≤366 365, D1
Hari Kuartal Hari kuartal Partial 92 Kuartal Hari 10, QD2, 50
Hari Dalam Sebulan Hari dalam sebulan Partial 31 Hari Bulan 30, MD10, 30
Hari dalam Seminggu Hari dalam seminggu Partial 7 Hari Kerja ke-5, WD5, 5

Selain kategori ini, Anda dapat mengaitkan sejumlah kolom pada tabel Anda dengan kategori Terkait waktu . Saat ini tidak dimungkinkan dalam opsi kalender, tetapi hanya dapat dilakukan menggunakan alat eksternal atau TMDL.

Nota

Konteks pada kolom apa pun yang ditetapkan ke kategori terkait waktu dihapus saat melakukan penghitungan di semua fungsi kecuali DATEADD dan SAMEPERIODLASTYEAR. Konteks apa pun pada kolom yang merupakan bagian dari tabel yang mendefinisikan kalender namun tidak ditandai dalam kalender tersebut akan tetap disimpan.

Nota

Kami sarankan Anda hanya mengaitkan kolom di kalender yang ingin Anda gunakan dalam perhitungan inteligensi waktu.

Kolom primer versus terkait

Kolom utama diperlukan untuk setiap kategori. Setiap kali kolom atau kolom terkait yang ditetapkan ke kategori yang sama pada kalender yang direferensikan berada dalam konteks atau kategori diperlukan untuk melakukan penghitungan, Power BI menggunakan kolom utama. Selain itu, kolom utama digunakan untuk pengurutan. Jika nilai di kolom utama tidak memungkinkannya diurutkan seperti yang diharapkan, Anda dapat mengonfigurasi kolom utama untuk mengurutkan menurut kolom lain atau menggunakan kolom lain dan menjadikan kolom asli kolom terkait. Misalnya, kolom dengan data tekstual yang berisi nomor bulan dan tahun dalam format mm-yyyy (yaitu, , 01-202402-2024, dan sebagainya) tidak akan mengurutkan dengan benar selama beberapa tahun, tetapi kolom yang menggunakan yyyy-mm format akan:

Cuplikan layar memperlihatkan dua tabel. Setiap tabel memiliki satu kolom. Tabel pertama berisi kolom yang berisi nomor bulan tekstual dan informasi tahun dalam format mm-yyyy dan yang kedua berisi informasi yang sama dalam format yyyy-mm. Kolom yang berisi data format mm-yyyy tidak diurutkan dengan benar.

Anda bisa memiliki nol atau lebih kolom terkait yang ditetapkan ke kategori.

Validation

Penting untuk memvalidasi dan menguji kalender Anda sehingga Anda yakin kalender tersebut memenuhi kebutuhan Anda. Validasi yang ditawarkan di Power BI mencakup validasi real-time dan validasi offline.

Nota

Anda dapat menyimpan kalender Anda meskipun terdapat kesalahan validasi offline, tetapi menyelesaikannya terlebih dahulu disarankan. Kesalahan validasi waktu nyata harus diperbaiki agar dapat disimpan.

Validasi real-time

Validasi real time yang dilakukan pada kalender adalah:

  • Nama kalender unik. Setiap kalender harus memiliki nama unik dalam model semantik.
  • Asosiasi tunggal per kalender. Kolom tidak boleh termasuk dalam lebih dari satu kategori dalam kalender yang sama.
  • Keunikan Periode. Kategori yang ditetapkan harus mengidentifikasi periode secara unik.
  • Kategorisasi yang konsisten. Ini memastikan bahwa kolom dikaitkan dengan kategori yang sama di seluruh kalender.

Keunikan Periode

Harus selalu ada jalur untuk mengidentifikasi periode untuk kategori yang ditetapkan secara unik.

Setiap kali Anda menambahkan kategori parsial, Power BI memvalidasi bahwa kombinasi kategori lengkap atau parsial yang cocok juga ditandai dalam kalender yang sama. Jika bukan itu masalahnya, peringatan akan ditampilkan.

Cuplikan layar memperlihatkan layar pembuatan dan pengeditan kalender dengan kesalahan validasi real time.

Misalnya, saat menyiapkan kalender untuk perhitungan berbasis minggu, pastikan untuk menetapkan setidaknya kolom utama ke salah satu kumpulan kategori berikut:

  • Minggu
  • Minggu Dalam Setahun, Tahun
  • Minggu Kuartal, Kuartal
  • Minggu Kuartal, Kuartal Tahun, Tahun
  • Minggu Dalam Sebulan, Bulan
  • Minggu dalam Bulan, Bulan dalam Tahun, Tahun
  • Minggu Dalam Sebulan, Bulan Kuartal, Kuartal
  • Minggu dalam Bulan, Bulan dalam Kuartal, Kuartal dalam Tahun, Tahun

Kategorisasi yang konsisten

Kolom harus memiliki kategori yang konsisten di seluruh kalender. Anda tidak dapat menetapkan kolom yang sama ke kategori yang berbeda seperti Tahun, Triwulan Tahun, atau terkait waktu di kalender terpisah.

Validasi offline

Validasi offline berpotensi memakan waktu saat mengakses data tabel. Oleh karena itu, tidak seperti validasi real-time, mereka tidak berjalan secara otomatis. Untuk menjalankan validasi, pilih Validasi data:

Cuplikan layar memperlihatkan layar pembuatan dan pengeditan kalender. Tombol Validasi data disorot.

Validasi offline memeriksa aturan berikut dan mengembalikan peringatan jika ada aturan yang tidak valid di kalender Anda:

  • kolom yang terkait dengan kategori tidak memiliki nilai kosong.
  • kategori level tinggi dan level rendah memiliki rasio kardinalitas satu ke banyak. Misalnya, kolom yang terkait dengan kategori Tahun harus memiliki kardinalitas satu-ke-banyak dengan kolom yang terkait dengan kategori Bulan.
  • kolom yang terkait dengan kategori pada tingkat yang sama memiliki rasio 1:1 dalam hal kardinalitas. Misalnya, kolom yang terkait dengan kategori Bulan harus memiliki kardinalitas satu-ke-satu dengan kombinasi kolom yang terkait dengan kategori Bulan Tahun dan Tahun.
  • kolom utama dan terkait yang ditetapkan ke kategori yang sama memiliki rasio kardinalitas satu-ke-satu. Misalnya, saat ditetapkan ke kategori Bulan, kolom utama Bulan dan kolom terkait EnglishMonthName harus memiliki kardinalitas satu-ke-satu.

Bekerja dengan kalender

Setelah kalender ditentukan, Anda dapat merujuknya dalam fungsi Inteligensi waktu. Misalnya, ukuran berikut menghitung nilai total bulan hingga saat ini dari Total Kuantitas terhadap kalender ISO-454 :

Total Quantity MTD ISO-454 = TOTALMTD ( [Total Quantity], 'ISO-454' )

Jika kalender tidak ditentukan dan kesalahan dikembalikan:

Cuplikan layar memperlihatkan pengukuran menggunakan TOTALMTD fungsi dengan parameter kalender ke kalender yang tidak ada.

Meskipun kalender ditentukan, pengukuran mungkin masih mengembalikan kesalahan. Ini terjadi jika fungsi yang digunakan mengharapkan kategori ada di kalender dan kalender tidak memiliki kategori tersebut. Misalnya, TOTALWTD mengharapkan kategori tertentu ada di kalender. Jika tidak, kesalahan dikembalikan:

Cuplikan layar memperlihatkan pengukuran menggunakan TOTALWTD fungsi dengan referensi kalender yang valid yang tidak menentukan kategori yang diperlukan.

Fungsi kecerdasan waktu dan kategori yang diperlukan

Banyak fungsi inteligensi Waktu memerlukan kategori yang memadai untuk disertakan pada kalender yang dirujuk dalam panggilan fungsi sehingga Power BI dapat mengidentifikasi unit waktu yang unik. Dengan kata lain, Power BI harus dapat "menaikkan" dari tingkat di mana perhitungan dilakukan ke satu tahun individual. Misalnya, saat melakukan perhitungan pada kuartal, gunakan TOTALQTD tetapkan kategori Kuartal, atau tetapkan Kuartal Tahun dan Tahun dalam kalender sebagaimana ditentukan oleh validasi keunikan periode .

Nota

Untuk beberapa fungsi, namanya menunjukkan tingkat mana penghitungan beroperasi (misalnya, TOTALYTD), sementara untuk fungsi lain tergantung pada parameter dan konteks (misalnya, DATEADD).

Pembersihan konteks

Fungsi inteligensi waktu beroperasi dengan memulai pada titik waktu, dan kemudian melakukan beberapa operasi di atasnya untuk menghasilkan titik waktu yang berbeda. Secara alami, titik waktu awal dapat bertentangan dengan hasil ini, sehingga menyebabkan persimpangan konteks filter yang secara default, akan menghasilkan hasil parsial atau kosong. Misalnya, pertimbangkan skenario berikut.

Definisi kalender

Kami memiliki kalender Gregorian sederhana yang menandai tiga kategori, yang didefinisikan sebagai:

Kategori Kolom Utama
Tahun Tahun
Bulan dalam Tahun BulanDalamTahun
Kuartal Kuartal

Mengukur definisi

Dua langkah dasar didefinisikan: satu untuk menghitung total penjualan, dan satu lagi untuk menghitung total penjualan dari kuartal sebelumnya:

[TotalSales] = CALCULATE ( SUM( FactInternetSales[SalesAmount] ) )
[LastQuarterSales] = CALCULATE ( [TotalSales], DATEADD( GregorianCalendar, -1, QUARTER ) )

Contoh: Cara Kerja Pembersihan Konteks

Tabel kami menelusuri granularitas satu bulan menggunakan kolom Year dan MonthOfYear :

Tahun BulanDalamTahun TotalSales PenjualanKuartalTerakhir
2011 1 10
2011 2 20
2011 3 30
2011 4 40 10
2011 5 50 20

Dalam tabel ini, baris yang ditebalkan menunjukkan penjelajahan pada tingkat bulanan, untuk bulan April 2011. Dengan demikian, semua langkah dalam baris ini akan dievaluasi di bawah konteks filter [Tahun] == 2011 dan [MonthOfYear] == 4.
Seperti yang diharapkan, TotalSales di sini dihitung sebagai total penjualan untuk April 2011.

LastQuarterSales juga menghitung TotalSales, tetapi diberi filter tambahan yang disediakan oleh DATEADD fungsi berbasis kalender. Untuk baris ini, DATEADD akan memiliki titik awal pada waktu April 2011, dan akan menghasilkan titik waktu yang tepat seperempat yang lalu: Januari 2011. Akibatnya, seseorang mungkin mengharapkan TotalSales ini dihitung di bawah dua konteks filter berikut:

  • Ditampilkan oleh kolom penjelajahan baris saat ini: { [Year] == 2011, [MonthOfYear] == 4 } (Yaitu, April 2011)
  • Disediakan oleh DATEADD filter: { [Year] == 2011, [MonthOfYear] == 1 } (Setara dengan Januari 2011)

Dengan jelas, kedua konteks filter ini akan bertentangan - kami tidak dapat mengevaluasi total penjualan yang diberikan bulan ini seperti Januari 2011 dan April 2011. Persimpangan seperti itu tidak akan menghasilkan hasil. Namun, ini bukan yang terjadi. Sebagai gantinya, berdasarkan definisi kalender, fungsi inteligensi waktu berbasis kalender mengidentifikasi kolom kategori mana yang dapat mengakibatkan konflik, mengikuti operasi waktu yang dilakukan fungsi. Dalam kasus ini, DATEADD melakukan pergeseran di tingkat Kuartal. Fungsi ini mengidentifikasi bahwa kategori Tahun dan Bulan Tahun dapat berubah sebagai akibat dari perubahan kolom kategori Kuartal . Dengan demikian, fungsi menghapus konteks filter pada semua kolom (utama dan terkait) yang ditandai ke kategori tersebut.

Dengan kata lain, kita dapat mengatakan bahwa kategori Tahun dan Bulan Tahun adalah dependensi dari kategori Kuartal . Sebaliknya, kita dapat mengatakan bahwa kategori Kuartal adalah dependen dari kategori Tahun dan Bulan Tahun .

Cara kerja pembersihan konteks

Diagram struktur kisi dari semua kategori kalender.

Diagram ini disediakan untuk memvisualisasikan dependensi dengan lebih baik antara kategori waktu yang berbeda. Setiap kategori dalam struktur kisi ini mewakili semua kolom (utama dan terkait) yang ditandai untuk kategori itu. Kategori terhubung ke dependensinya melalui panah. Misalnya, "Bulan" tergantung pada "Tahun", "Kuartal Tahun", "Bulan Kuartal", "Kuartal", dan "Bulan Tahun".

Saat konteks diatur pada kolom atau kolom urutkan berdasar terkait yang ditandai dalam kalender, konteks filter sebelumnya dibersihkan pada:

  1. Semua dependensi kategori X. Ini dapat dianggap sebagai semua kategori di atas X.
  2. Semua dependen kategori dari X dan dependensinya (yaitu, dari 1. di atas). Ini dapat dianggap sebagai semua kategori di bawah X dan semua kategori yang ada pada poin 1 di atas.

Nota

Pembersihan konteks terjadi pada kolom yang ditandai dalam kalender atau kolom pengurutan terkait tanpa memandang apakah konteks diatur menggunakan fungsi inteligensi waktu atau sebaliknya.

Sebagian besar fungsi inteligensi waktu, kecuali dan DATEADDSAMEPERIODLASTYEAR, akan menghapus konteks pada semua kolom terkait waktu dan kolom urutkan berdasar terkait.

Perilaku lintas kalender

Jika ada beberapa kalender yang ditentukan pada tabel yang sama, proses ini diselesaikan untuk setiap kalender yang ditentukan pada tabel. Ini termasuk komentar mengenai penghapusan konteks kolom terkait waktu. Dengan kata lain, asumsikan tabel menentukan tiga kalender: Calendar1, Calendar2, dan Calendar3. Jika konteks filter diatur pada kategori "X" di Calendar1, proses di atas dilakukan pada ketiga kalender.

Contoh: Filter disetel ke "Kuartal"

Jika konteks filter diatur pada kategori "Kuartal", prosesnya adalah sebagai berikut.

  1. Pertama, semua ketergantungan dari kategori "Kuartal" akan dipertimbangkan.

    Contoh perilaku penghapusan konteks filter dimulai dari Kategori Kuartal: Dependensi.

  2. Selanjutnya, semua dependen "Kuartal" dan dependensinya akan dipertimbangkan.

    Contoh perilaku penghapusan konteks filter mulai dari kategori Kuartal: Bergantung.

  3. Akhirnya, hasil akhirnya adalah sebagai berikut. Semua kategori yang berwarna merah akan kehilangan konteks filter sebelumnya, dan konteks baru akan ditetapkan pada Kuartal.

    Contoh perilaku penghapusan konteks filter dimulai dari Kategori Kuartal: Hasil

Skrip TMDL untuk kalender

createOrReplace

	table Date
		lineageTag: xyz

		column Date
			dataType: dateTime
			formatString: Long Date
			lineageTag: abc
			summarizeBy: none
			sourceColumn: Date

        column Year
			dataType: string
			lineageTag: abc
			summarizeBy: none
			sourceColumn: Year

			annotation SummarizationSetBy = Automatic
        
        column Month
			dataType: string
			lineageTag: def
			summarizeBy: none
			sourceColumn: Month

			annotation SummarizationSetBy = Automatic

        column MonthName
			dataType: string
			lineageTag: ghi
			summarizeBy: none
			sourceColumn: MonthName
			sortByColumn: SortByMonth

			changedProperty = SortByColumn

			annotation SummarizationSetBy = Automatic

        column DutchMonthName
			dataType: string
			lineageTag: jkl
			summarizeBy: none
			sourceColumn: DutchMonthName

			annotation SummarizationSetBy = Automatic

        column 'Holiday Name'
			dataType: string
			lineageTag: mno
			summarizeBy: none
			sourceColumn: Holiday Name

			annotation SummarizationSetBy = Automatic
        
        column IsWorkingDay
			dataType: string
			lineageTag: pqr
			summarizeBy: none
			sourceColumn: IsWorkingDay

			annotation SummarizationSetBy = Automatic
		...	
		
		calendar 'Demo Calendar'
			lineageTag: def

			calendarColumnGroup = year
				primaryColumn: Year

			calendarColumnGroup = month
				primaryColumn: Month
				associatedColumn: DutchMonthName
				associatedColumn: MonthName
			
			calendarColumnGroup
                column: 'Holiday Name'
                column: isWorkingDay

Nota

Perhatikan bahwa jika Anda tidak menentukan kategori apa pun untuk calendarColumnGroup di TMDL, kolom ditandai sebagai terkait waktu. Dalam contoh ini, Nama Hari Libur dan isWorkingDay adalah kolom terkait waktu di Kalender Demo.

Satukan semuanya: Contoh pergeseran waktu

Beberapa fungsi inteligensi waktu hanya menggeser konteks secara lateral, mempertimbangkan semua kolom, sementara yang lain melakukan pergeseran hierarkis—menyimpan atau menghapus konteks berdasarkan apakah kolom ditandai di kalender. Fungsi inteligensi waktu dapat dibagi menjadi dua kelompok berdasarkan apakah fungsi tersebut memungkinkan pergeseran hierarkis:

  • Diperbaiki. Fungsi dalam grup ini adalah DATEADD dan SAMEPERIODLASTYEAR. Fungsi-fungsi ini hanya memungkinkan pergeseran waktu lateral dan tidak mengembalikan nilai dari tingkat detail yang berbeda.
  • Fleksibel. Grup ini mencakup semua fungsi inteligensi waktu yang lain. Fungsi-fungsi ini memungkinkan pergeseran waktu hierarkis dan tergantung pada pengaturan kalender dapat mengembalikan hasil dari tingkat detail yang berbeda.

Untuk memperlihatkan perilaku ini, mari kita telusuri contoh menggunakan model data sederhana yang terdiri dari dua tabel, dua kalender, dan lima pengukuran.

Tabel dan hubungan

Untuk contoh ini, kami memiliki model data sederhana berikut:

Table Kolom-kolom
Tanggal Tahun, IsWorkingDay, Tanggal
Sales OrderKey, Kuantitas, TanggalPesanan

Berikut adalah beberapa contoh baris dalam tabel Tanggal : Cuplikan layar memperlihatkan 14 baris pertama dari contoh tabel Tanggal. Tabel menentukan Tanggal, Tahun, dan IsWorkingDay. Kolom Tanggal berisi tanggal, kolom Tahun nilai tahun, dan kolom IsWorkingDay adalah kolom boolean (True/False) yang menunjukkan apakah tanggal tersebut adalah hari kerja atau tidak.

Berikut adalah beberapa contoh baris dalam tabel Penjualan : Cuplikan layar memperlihatkan sembilan baris pertama dari contoh tabel Penjualan. Tabel menentukan OrderKey, OrderDate, dan Order Quantity. Kolom OrderKey berisi angka unik untuk setiap pesanan penjualan, OrderDate adalah tanggal yang berkaitan dengan Penjualan hingga Tanggal dan Kuantitas Pesanan adalah kolom numerik yang mewakili jumlah produk untuk setiap pesanan.

Tabel Penjualan dan Tabel Tanggal berhubungan melalui kolom OrderDate dan Date.

Cuplikan layar memperlihatkan tampilan model untuk model contoh. Ini menunjukkan tabel Penjualan dan Tanggal dan hubungan satu-ke-banyak di antara mereka pada OrderDate dan Date.

Kalender

Pada tabel Tanggal , kami menentukan kalender dengan pemetaan ini:

Nama Kalender Kategori Kolom Utama
Gregorian Tahun Tahun
Tanggal Tanggal
GregorianWithWorkingDay Tahun Tahun
Tanggal Tanggal
Terkait waktu AdalahHariKerja

Definisi TMDL yang setara dari kedua kalender ini adalah:

ref table Date
    calendar 'Gregorian'
        lineageTag: xyz
    
        calendarColumnGroup = year
    	    primaryColumn: Year
    
    	calendarColumnGroup = date
    		primaryColumn: Date
    
    calendar 'GregorianWithWorkingDay'
    	lineageTag: dc4fc383-1661-4112-8afb-930d324fbb6e
    
    	calendarColumnGroup = year
    		primaryColumn: Year
    
    	calendarColumnGroup = date
    		primaryColumn: Date
    
    	calendarColumnGroup
    		column: IsWorkingDay   

Tindakan

Pada tabel Penjualan , kami menentukan langkah-langkah berikut:

Total Quantity = SUM ( 'Sales'[Order Quantity] )

OneYearAgoQuantity =
CALCULATE ( [Total Quantity], DATEADD ( 'Gregorian', -1, YEAR ) )

OneYearAgoQuantityTimeRelated =
CALCULATE ( [Total Quantity], DATEADD ( 'GregorianWithWorkingDay', -1, YEAR ) )

FullLastYearQuantity =
CALCULATE ( [Total Quantity], PARALLELPERIOD ( 'Gregorian', -1, YEAR ) )

FullLastYearQuantityTimeRelated =
CALCULATE ( [Total Quantity], PARALLELPERIOD ( 'GregorianWithWorkingDay', -1, YEAR )
)

Contoh pergeseran lateral

Mari kita buat visual yang menunjukkan Year, MonthOfYear, IsWorkingDay, Total Quantity, OneYearAgoQuantity dan OneYearAgoQuantityTimeRelated untuk 2024 dan 2025:

Cuplikan layar memperlihatkan visual tabel yang memperlihatkan Year, IsWorkingDay, Total Quantity, OneYearAgoQuantity dan OneYearAgoQuantityTimeRelated. Nilai untuk OneYearAgoQuantity dan OneYearAgoQuantityTimeRelated untuk 2025 cocok dengan nilai untuk 2024 untuk nilai IsWorkingDay yang sama.

Semua nilai untuk OneYearAgoQuantity dan OneYearAgoQuantityTimeRelated untuk 2025 cocok dengan Jumlah Total dari tepat satu tahun sebelumnya (2024), untuk nilai IsWorkingDay yang sama.

Ini menunjukkan bahwa DATEADD mempertahankan konteks pada kolom mana pun di tabel Tanggal yang menggunakan kalender tersebut, terlepas dari apakah kolom itu tidak ditandai atau ditandai sebagai berkaitan dengan waktu pada kalender itu. Karena dalam definisi ukuran kami, kami menginstruksikan untuk DATEADD kembali satu Tahun, satu-satunya kolom yang konteksnya digeser adalah kolom yang terkait dengan kategori Tahun. Apakah kolom IsWorkingDay ditandai di kalender sebagai terkait waktu atau tidak ditandai sama sekali tidak mengubah hasilnya. Satu-satunya fungsi lain yang menunjukkan perilaku ini adalah SAMEPERIODLASTYEAR.

Contoh pergeseran hierarkis

Sekarang, mari kita lihat contoh yang menunjukkan apakah kolom ditandai sebagai terkait waktu atau tidak, ini memang memengaruhi hasilnya.

Untuk ini, kita akan membuat ulang visual yang sama seperti dalam contoh sebelumnya, tetapi kali ini kita akan menggunakan langkah-langkah FullLastYearQuantity dan FullLastYearQuantityTimeRelated: Cuplikan layar memperlihatkan visual tabel yang menunjukkan Year, IsWorkingDay, Total Quantity, FullLastYearQuantity dan FullLastYearQuantityTimeRelated. Nilai untuk FullLastYearQuantity 2025 cocok dengan nilai untuk 2024 untuk nilai IsWorkingDay yang sama, tetapi nilai untuk FullLastYearQuantityTimeRelated sama dengan nilai jumlah total terlepas dari nilai IsWorkingDay.

Ini menunjukkan bahwa PARALLELPERIOD mempertahankan konteks untuk kolom yang tidak ditandai di kalender tetapi menghapus konteks untuk yang ditandai sebagai terkait waktu. FullLastYearQuantity menggunakan kalender Gregorian di mana IsWorkingDay tidak ditandai di kalender, sementara FullLastYearQuantityTimeRelated menggunakan kalender GregorianWithWorkingDay tempat IsWorkingDay ditandai sebagai terkait waktu. Semua fungsi intelijen waktu kecuali DATEADD dan SAMEPERIODLASTYEAR berfungsi dengan cara ini.

Bonus: Jika Anda benar-benar ingin memaksa fungsi-fungsi ini untuk mempertahankan konteks untuk kolom terkait waktu juga, Anda dapat menggunakan VALUES:

FullLastYearQuantityTimeRelatedOverride =
CALCULATE ( [Total Quantity], PARALLELPERIOD ( 'GregorianWithWorkingDay', -1, YEAR ), VALUES('Date'[IsWorkingDay]) )

Dalam hal ini, FullLastYearQuantityTimeRelatedOverride mengembalikan hasil yang sama dengan FullLastYearQuantity.

Conclusion

Contoh rumit di atas menunjukkan bahwa fungsi inteligensi waktu yang berbeda bertingkah berbeda tergantung pada apakah kolom ditandai sebagai terkait waktu di kalender. DATEADD dan SAMEPERIODLASTYEAR hanya melakukan pergeseran waktu lateral. Semua fungsi inteligensi waktu lainnya memungkinkan pergeseran waktu hierarkis.

Gunakan DATEADD dan DATESINPERIOD dengan kalender

Fungsi DATEADD dan DATESINPERIOD memiliki parameter khusus yang memungkinkan kontrol terperinci tentang bagaimana pergeseran dilakukan ketika pemilihan berada pada tingkat yang lebih rinci daripada parameter tingkat pergeseran yang ditunjukkan oleh interval. Ini terjadi, misalnya, jika Anda menampilkan data pada tingkat tanggal tetapi atur interval parameter ke fungsi-fungsi ini ke MONTH. Misalnya, dalam kalender Gregorian, ketika menggeser periode yang mencakup 3 hingga 10 Maret per bulan akan menghasilkan 3 hingga 10 April. Namun, karena bulan-bulan dalam kalender Gregorian bervariasi dalam panjang, ini dapat menyebabkan ambiguitas saat ada perubahan. Di bawah ini adalah contoh skenario berdasarkan kalender Gregorian:

Bergeser dari periode yang lebih pendek ke yang lebih lama

Misalnya, bergeser ke depan satu bulan dengan pilihan pada bulan Februari, sehingga bulan target adalah Maret. Anda dapat menggunakan parameter extension pada DATEADD untuk memengaruhi bagaimana pergeseran dilakukan.

Nilai parameter ekstensi Description Result
precise Ini menjaga rentang tanggal asli dengan ketat. 25-28 Februari digeser ke 25-28 Maret.
extended Memungkinkan jendela meluas ke akhir bulan. 25-28 Februari digeser ke 25-31 Maret.
endaligned Menyelaraskan tanggal akhir dengan akhir bulan tujuan saat pilihan mencapai akhir bulannya; jika tidak, pertahankan posisi relatif. 28 Februari digeser ke 31 Maret, sedangkan 27 Februari digeser ke 27 Maret.

Nota

DATESINPERIOD menyediakan endbehavior parameter yang menawarkan precise opsi dan endaligned opsi.

Bergeser dari periode yang lebih lama ke yang lebih pendek

Misalnya, bergeser mundur satu bulan dengan seleksi pada bulan Maret, sehingga bulan targetnya adalah Februari.

Anda dapat menggunakan truncation parameter pada DATEADD untuk memengaruhi bagaimana pergeseran dilakukan:

Nilai parameter pemotongan Description Result
anchored Jangkar hasil ke tanggal valid terakhir bulan yang lebih kecil. 31 Maret digeser ke 28 Februari (atau 29 pada tahun kabisat).
blank Jika tanggal yang digeser tidak ada, kembalikan kosong. Mengubah 31 Maret mundur satu bulan mengembalikan kosong (karena tidak ada 31 Februari).

Nota

Parameter ini tidak tersedia untuk DATEINPERIOD.

Pertimbangan untuk bekerja dengan kecerdasan waktu berbasis kalender

  • Melakukan perhitungan inteligensi waktu pada tabel fakta yang mengatur kalender, tunduk pada aturan Keamanan tingkat baris (RLS), dan dapat menyebabkan hasil yang tidak terduga.
  • Performa fitur pratinjau ini tidak mewakili produk akhir.
  • Anda belum dapat menulis kalender di Layanan Power BI.
  • Anda tidak boleh menggunakan tabel tanggal/waktu otomatis dengan kalender kustom.
  • Anda tidak dapat menggunakan kalender dengan model terhubung langsung atau komposit.
  • Kami sarankan Anda hanya mengaitkan kolom di kalender yang ingin Anda gunakan dalam perhitungan inteligensi waktu.
  • Kalender tunduk pada validasi real-time dan offline . Anda dapat menyimpan kalender Anda meskipun terdapat kesalahan validasi offline, tetapi menyelesaikannya terlebih dahulu disarankan. Kesalahan validasi waktu nyata harus diperbaiki agar dapat disimpan.
  • Setiap kalender harus memiliki nama unik dalam model data
  • Satu tabel bisa berisi beberapa kalender
  • Tabel yang berisi kalender harus memiliki kurang dari 200 kolom. Jika tabel berisi lebih dari 20.000 baris, validasi tidak akan tersedia tetapi Anda masih bisa menambahkan kalender.
  • Kalender setidaknya harus menetapkan satu kolom utama ke kategori
  • Kalender hanya dapat menetapkan kolom dari tabelnya sendiri ke kategori
  • Setiap kategori harus memiliki kolom utama dan dapat memiliki nol atau lebih kolom terkait yang ditetapkan
  • DATEADD memiliki parameter baru untuk mengontrol ekstensi dan perilaku ekstensi, yang tidak dikenali di IntelliSense.
  • Kolom tertentu hanya dapat dipetakan ke satu kategori
  • Anda tidak dapat menumpuk fungsi inteligensi waktu yang menggunakan kalender. Misalnya, pernyataan DAX berikut tidak didukung:
ThisIsNotSupported = PREVIOUSDAY ( PREVIOUSMONTH( 'Calendar' ) )

Sebagai gantinya, Anda dapat melakukan:

ThisWorks = CALCULATETABLE ( PREVIOUSDAY ( 'Calendar' ), PREVIOUSMONTH( 'Calendar' ) )

Membuat tabel tanggal menggunakan alat bawaan

Contoh berikut membuat tabel tanggal dari 1 Januari 2010 hingga 31 Desember 2030 menggunakan Power Query M atau DAX. Ini termasuk kolom berikut: Tahun, Nomor Bulan, Nama Bulan, Tahun Bulan, Kuartal, Kuartal Tahun, Hari, dan Tanggal.

Power Query M

let
    StartDate = #date(2010, 1, 1),
    EndDate = #date(2030, 12, 31),
    NumberOfDays = Duration.Days(EndDate - StartDate) + 1,
    DateList = List.Dates(StartDate, NumberOfDays, #duration(1,0,0,0)),
    DateTable = Table.FromList(DateList, Splitter.SplitByNothing(), {"Date"}),
    AddYear = Table.AddColumn(DateTable, "Year", each Date.Year([Date]), Int64.Type),
    AddMonthNumber = Table.AddColumn(AddYear, "Month Number", each Date.Month([Date]), Int64.Type),
    AddMonthName = Table.AddColumn(AddMonthNumber, "Month Name", each Date.ToText([Date], "MMMM"), type text),
    AddMonthYear = Table.AddColumn(AddMonthName, "Month Year", each Date.ToText([Date], "MMM yyyy"), type text),
    AddQuarter = Table.AddColumn(AddMonthYear, "Quarter", each "Q" & Text.From(Date.QuarterOfYear([Date])), type text),
    AddYearQuarter = Table.AddColumn(AddQuarter, "Year Quarter", each Text.From(Date.Year([Date])) & " Q" & Text.From(Date.QuarterOfYear([Date])), type text),
    AddDay = Table.AddColumn(AddYearQuarter, "Day", each Date.Day([Date]), Int64.Type)
in
    AddDay

DAX

DateTable =
ADDCOLUMNS (
    CALENDAR ( DATE ( 2010, 1, 1 ), DATE ( 2030, 12, 31 ) ),
    "Year", YEAR ( [Date] ),
    "Month Number", MONTH ( [Date] ),
    "Month Name", FORMAT ( [Date], "MMMM" ),
    "Month Year", FORMAT ( [Date], "MMM YYYY" ),
    "Quarter", "Q" & FORMAT ( [Date], "Q" ),
    "Year Quarter",
        FORMAT ( [Date], "YYYY" ) & " Q"
            & FORMAT ( [Date], "Q" ),
    "Day", DAY ( [Date] ),
    "Date", [Date]
)

Untuk informasi selengkapnya dan opsi lainnya lihat Tabel tanggal.

Untuk informasi selengkapnya terkait artikel ini, lihat sumber daya berikut ini: