Artikel ini adalah tentang fungsi Jendela T-SQL (Transact-SQL) dan penggunaan dasarnya dalam tugas analisis data sehari-hari.
Ada banyak alternatif untuk T-SQL dalam hal analisis data. Namun, ketika perbaikan dari waktu ke waktu dan pengenalan fungsi Window dipertimbangkan, T-SQL mampu melakukan analisis data pada tingkat dasar dan, dalam beberapa kasus, bahkan lebih dari itu.
Tentang Fungsi Jendela SQL
Pertama, mari kenali dulu fungsi SQL Window dalam konteks dokumentasi Microsoft.
Definisi Microsoft
Fungsi jendela menghitung nilai untuk setiap baris di jendela.
Definisi Sederhana
Fungsi jendela membantu kita untuk fokus pada bagian tertentu (jendela) dari kumpulan hasil sehingga kita dapat melakukan analisis data pada bagian tertentu (jendela) saja, bukan pada keseluruhan kumpulan hasil.
Dengan kata lain, fungsi jendela SQL mengubah kumpulan hasil menjadi beberapa kumpulan yang lebih kecil untuk tujuan analisis data.
Apa yang dimaksud dengan kumpulan hasil
Sederhananya, kumpulan hasil terdiri dari semua catatan yang diambil dengan menjalankan kueri SQL.
Misalnya, kita dapat membuat tabel bernama Produk dan masukkan data berikut ke dalamnya:
-- (1) Create the Product table CREATE TABLE [dbo].[Product] ( [ProductId] INT NOT NULL PRIMARY KEY, [Name] VARCHAR(40) NOT NULL, [Region] VARCHAR(40) NOT NULL ) -- (2) Populate the Product table INSERT INTO Product (ProductId,Name,Region) VALUES (1,'Laptop','UK'),(2,'PC','UAE'),(3,'iPad','UK')
Sekarang, kumpulan hasil yang diambil dengan menggunakan skrip di bawah ini akan berisi semua baris dari Produk tabel:
-- (3) Result set SELECT [ProductId], [Name],[Region] FROM Product
Apa itu Jendela
Penting untuk terlebih dahulu memahami konsep jendela yang berkaitan dengan fungsi jendela SQL. Dalam konteks ini, jendela hanyalah cara untuk mempersempit cakupan Anda dengan menargetkan bagian tertentu dari kumpulan hasil (seperti yang telah kami sebutkan di atas).
Anda mungkin bertanya-tanya sekarang – apa arti sebenarnya dari 'menargetkan bagian tertentu dari kumpulan hasil'?
Kembali ke contoh yang kita lihat, kita dapat membuat jendela SQL berdasarkan wilayah produk dengan membagi hasil yang ditetapkan menjadi dua jendela.
Memahami Row_Number()
Untuk melanjutkan, kita perlu menggunakan fungsi Row_Number() yang untuk sementara memberikan nomor urut ke baris keluaran.
Misalnya, jika kita ingin menambahkan nomor baris ke kumpulan hasil berdasarkan ProductID, kita harus menggunakan ROW_NUMBER() untuk memesannya dengan ID Produk sebagai berikut:
--Using the row_number() function to order the result set by ProductID SELECT ProductID,ROW_NUMBER() OVER (ORDER BY ProductID) AS SrNo,Name,Region FROM Product
Sekarang, jika kita menginginkan fungsi Row_Number() untuk memesan hasil yang ditetapkan oleh ProductID menurun, maka urutan baris keluaran berdasarkan ProductID akan berubah sebagai berikut:
--Using the row_number() function to order the result set by ProductID descending SELECT ProductID,ROW_NUMBER() OVER (ORDER BY ProductID DESC) AS SrNo,Name,Region FROM Product
Belum ada jendela SQL karena satu-satunya hal yang telah kami lakukan adalah mengurutkan kumpulan berdasarkan kriteria tertentu. Seperti yang telah dibahas sebelumnya, windowing berarti memecah kumpulan hasil menjadi beberapa kumpulan yang lebih kecil untuk menganalisis masing-masing secara terpisah.
Membuat Jendela dengan Row_Number()
Untuk membuat jendela SQL di kumpulan hasil kami, kami perlu mempartisinya berdasarkan kolom mana pun yang ada di dalamnya.
Kita sekarang dapat mempartisi hasil yang ditetapkan berdasarkan wilayah sebagai berikut:
--Creating a SQL window based on Region SELECT ROW_NUMBER() OVER (Partition by region ORDER BY Region) as Region_Serial_Number , Name, Region FROM dbo.Product
Pilih – Over Clause
Dengan kata lain, Pilih dengan Berakhir klausa membuka jalan bagi fungsi jendela SQL dengan mempartisi hasil yang ditetapkan ke dalam jendela yang lebih kecil.
Menurut dokumentasi Microsoft, Pilih dengan Lebih dari klausa mendefinisikan jendela yang kemudian dapat digunakan oleh fungsi jendela apa pun.
Sekarang, mari buat tabel bernama Produk Dapur sebagai berikut:
CREATE TABLE [dbo].[KitchenProduct] ( [KitchenProductId] INT NOT NULL PRIMARY KEY IDENTITY(1,1), [Name] VARCHAR(40) NOT NULL, [Country] VARCHAR(40) NOT NULL, [Quantity] INT NOT NULL, [Price] DECIMAL(10,2) NOT NULL ); GO INSERT INTO dbo.KitchenProduct (Name, Country, Quantity, Price) VALUES ('Kettle','Germany',10,15.00) ,('Kettle','UK',20,12.00) ,('Toaster', 'France',10,10.00) ,('Toaster','UAE',10,12.00) ,('Kitchen Clock','UK',50,20.00) ,('Kitchen Clock','UAE',35,15.00)
Sekarang, mari kita lihat tabelnya:
SELECT [KitchenProductId], [Name], [Country], [Quantity], [Price] FROM dbo.KitchenProduct
Jika Anda ingin melihat setiap produk dengan nomor serinya sendiri daripada nomor berdasarkan ID produk umum, maka Anda harus menggunakan fungsi jendela SQL untuk mempartisi hasil yang ditetapkan oleh produk sebagai berikut:
-- Viewing each product in its own series SELECT ROW_NUMBER() OVER (Partition by Name order by Name) Product_SrNo,Name,Country,Quantity FROM dbo.KitchenProduct
Kompatibilitas (Pilih – Over Clause)
Menurut dokumentasi Microsoft , Select – Over Clause kompatibel dengan versi database SQL berikut:
- SQL Server 2008 dan lebih tinggi
- Database SQL Azure
- Gudang Data Azure SQL
- Gudang Data Paralel
Sintaks
PILIH – OVER (Partisi menurut
Harap dicatat bahwa saya telah menyederhanakan sintaks untuk membuat i t mudah dimengerti; silakan merujuk ke yang Dokumentasi Microsoft untuk melihat penuh sintaks.
Prasyarat
Artikel ini pada dasarnya ditulis untuk pemula, tetapi masih ada beberapa prasyarat yang harus diingat.
Keakraban dengan T-SQL
Artikel ini mengasumsikan bahwa pembaca memiliki pengetahuan dasar tentang T-SQL dan mampu menulis dan menjalankan skrip SQL dasar.
Siapkan tabel contoh Penjualan
Artikel ini memerlukan tabel contoh berikut agar kita dapat menjalankan contoh fungsi jendela SQL:
-- (1) Create the Sales sample table CREATE TABLE [dbo].[Sales] ( [SalesId] INT NOT NULL IDENTITY(1,1), [Product] VARCHAR(40) NOT NULL, [Date] DATETIME2, [Revenue] DECIMAL(10,2), CONSTRAINT [PK_Sales] PRIMARY KEY ([SalesId]) ); GO -- (2) Populating the Sales sample table SET IDENTITY_INSERT [dbo].[Sales] ON INSERT INTO [dbo].[Sales] ([SalesId], [Product], [Date], [Revenue]) VALUES (1, N'Laptop', N'2017-01-01 00:00:00', CAST(200.00 AS Decimal(10, 2))) INSERT INTO [dbo].[Sales] ([SalesId], [Product], [Date], [Revenue]) VALUES (2, N'PC', N'2017-01-01 00:00:00', CAST(100.00 AS Decimal(10, 2))) INSERT INTO [dbo].[Sales] ([SalesId], [Product], [Date], [Revenue]) VALUES (3, N'Mobile Phone', N'2018-01-01 00:00:00', CAST(300.00 AS Decimal(10, 2))) INSERT INTO [dbo].[Sales] ([SalesId], [Product], [Date], [Revenue]) VALUES (4, N'Accessories', N'2018-01-01 00:00:00', CAST(150.00 AS Decimal(10, 2))) INSERT INTO [dbo].[Sales] ([SalesId], [Product], [Date], [Revenue]) VALUES (5, N'iPad', N'2019-01-01 00:00:00', CAST(300.00 AS Decimal(10, 2))) INSERT INTO [dbo].[Sales] ([SalesId], [Product], [Date], [Revenue]) VALUES (6, N'PC', N'2019-01-01 00:00:00', CAST(200.00 AS Decimal(10, 2))) INSERT INTO [dbo].[Sales] ([SalesId], [Product], [Date], [Revenue]) VALUES (7, N'Laptop', N'2019-01-01 00:00:00', CAST(300.00 AS Decimal(10, 2))) SET IDENTITY_INSERT [dbo].[Sales] OFF
Lihat semua penjualan dengan menjalankan skrip berikut:
-- View sales SELECT [SalesId],[Product],[Date],[Revenue] FROM dbo.Sales
Grup Menurut vs Fungsi Jendela SQL
Orang bisa bertanya-tanya – apa perbedaan antara menggunakan klausa Group By dan fungsi jendela SQL?
Nah, jawabannya ada pada contoh di bawah ini.
Kelompokkan Berdasarkan Contoh
Untuk melihat total penjualan berdasarkan produk, kita dapat menggunakan Group By sebagai berikut:
-- Total sales by product using Group By SELECT Product ,SUM(REVENUE) AS Total_Sales FROM dbo.Sales GROUP BY Product ORDER BY Product
Jadi, klausa Group By membantu kita melihat total penjualan. Nilai penjualan total adalah jumlah pendapatan untuk semua produk serupa di baris yang sama tanpa klausa Kelompokkan Menurut yang digunakan. Bagaimana jika kita tertarik untuk melihat pendapatan (penjualan) masing-masing produk beserta total penjualannya?
Di sinilah fungsi jendela SQL beraksi.
Contoh Fungsi Jendela SQL
Untuk melihat produk, pendapatan, dan pendapatan total oleh semua produk serupa, kami harus mempartisi data berdasarkan produk sampingan menggunakan OVER() sebagai berikut:
-- Total sales by product using an SQL window function SELECT Product ,REVENUE ,SUM(REVENUE) OVER (PARTITION BY PRODUCT) AS Total_Sales FROM dbo.Sales
Outputnya harus sebagai berikut:
Jadi, sekarang kita dapat dengan mudah melihat penjualan untuk masing-masing produk bersama dengan total penjualan untuk produk tersebut. Misalnya, pendapatan untuk PC adalah 100,00 tetapi total penjualan (jumlah pendapatan untuk PC produk) adalah 300,00 karena dua model PC yang berbeda sedang dijual.
Analisis Dasar dengan Fungsi Agregat
Fungsi agregat mengembalikan satu nilai setelah melakukan perhitungan pada sekumpulan data.
Di bagian ini, kita akan mengeksplorasi lebih lanjut fungsi jendela SQL – khususnya, dengan menggunakannya bersama dengan fungsi agregat untuk melakukan analisis data dasar.
Fungsi Agregat Umum
Fungsi agregat yang paling umum adalah:
- Jumlah
- Hitung
- Min
- Maks
- Rata-rata (Rata-rata)
Analisis Data Gabungan menurut Produk
Untuk menganalisis hasil yang ditetapkan berdasarkan produk sampingan dengan bantuan fungsi agregat, kita cukup menggunakan fungsi agregat dengan partisi produk sampingan di dalam pernyataan OVER():
-- Data analysis by product using aggregate functions SELECT Product,Revenue ,SUM(REVENUE) OVER (PARTITION BY PRODUCT) as Total_Sales ,MIN(REVENUE) OVER (PARTITION BY PRODUCT) as Minimum_Sales ,MAX(REVENUE) OVER (PARTITION BY PRODUCT) as Maximum_Sales ,AVG(REVENUE) OVER (PARTITION BY PRODUCT) as Average_Sales FROM dbo.Sales
Jika Anda melihat lebih dekat pada PC atau Laptop produk, Anda akan melihat bagaimana fungsi agregat bekerja bersama di samping fungsi jendela SQL.
Pada contoh di atas, kita dapat melihat bahwa nilai Pendapatan untuk PC adalah 100,00 pertama kali dan 200,00 waktu berikutnya, tetapi Total Penjualan berjumlah 300,00. Informasi serupa dapat dilihat untuk fungsi agregat lainnya.
Analisis Data Agregat Berdasarkan Tanggal
Sekarang, mari kita lakukan beberapa analisis data produk berdasarkan tanggal menggunakan fungsi jendela SQL yang dikombinasikan dengan fungsi agregat.
Kali ini, kita akan mempartisi hasil yang diset berdasarkan tanggal bukan berdasarkan produk sebagai berikut:
-- Data analysis by date using aggregate functions SELECT Product,date,Revenue ,SUM(REVENUE) OVER (PARTITION BY DATE) as Total_Sales ,MIN(REVENUE) OVER (PARTITION BY DATE) as Minimum_Sales ,MAX(REVENUE) OVER (PARTITION BY DATE) as Maximum_Sales ,AVG(REVENUE) OVER (PARTITION BY DATE) as Average_Sales FROM dbo.Sales
Dengan ini, kita telah mempelajari teknik analisis data dasar menggunakan pendekatan fungsi jendela SQL.
Hal yang harus dilakukan
Sekarang Anda sudah familiar dengan fungsi jendela SQL, silakan coba yang berikut ini:
- Dengan mengingat contoh yang kita lihat, lakukan analisis data dasar menggunakan fungsi jendela SQL pada database sampel yang disebutkan dalam artikel ini.
- Menambahkan kolom Pelanggan ke tabel sampel Penjualan dan melihat seberapa kaya analisis data Anda saat kolom lain (pelanggan) ditambahkan ke dalamnya.
- Menambahkan kolom Wilayah ke tabel sampel Penjualan dan melakukan analisis data dasar menggunakan fungsi gabungan menurut wilayah.