Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
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:
- Power Query M. Anda dapat menggunakan fungsi List.Dates . Contoh disediakan nanti dalam dokumen ini.
- DAX. Anda dapat menggunakan fungsi CALENDAR atau CALENDARAUTO untuk menghasilkan tabel tanggal terhitung dasar. Anda juga dapat menggunakan pernyataan DAX yang lebih canggih untuk membuat tabel tanggal. Contoh disediakan nanti dalam dokumen ini.
- Alat eksternal.
- Memuat dari sumber, seperti sistem sumber, file, atau model semantik Power BI lainnya.
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
- Tanggal tidak merata
- Perhitungan berbasis mingguan
- Peningkatan performa
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 .
- Di Power BI Desktop, buka Opsi File > dan pengaturan > Opsi > Pratinjau fitur.
- Pilih pratinjau Inteligensi Waktu DAX yang Ditingkatkan .
- Pilih OK
- 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:
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:
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
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.
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:
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.
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:
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:
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:
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 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:
- Semua dependensi kategori X. Ini dapat dianggap sebagai semua kategori di atas X.
- 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.
Kolom terkait waktu
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.
Pertama, semua ketergantungan dari kategori "Kuartal" akan dipertimbangkan.
Selanjutnya, semua dependen "Kuartal" dan dependensinya akan dipertimbangkan.
Akhirnya, hasil akhirnya adalah sebagai berikut. Semua kategori yang berwarna merah akan kehilangan konteks filter sebelumnya, dan konteks baru akan ditetapkan pada Kuartal.
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 :
Berikut adalah beberapa contoh baris dalam tabel Penjualan :
Tabel Penjualan dan Tabel Tanggal berhubungan melalui kolom 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:
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:
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.
Konten terkait
Untuk informasi selengkapnya terkait artikel ini, lihat sumber daya berikut ini: