Saya telah melihat banyak kegunaan ketika Anda perlu memproyeksikan 'data yang hilang'. Misalnya. Anda memiliki deret waktu (misalnya log akses) dan Anda ingin menunjukkan jumlah klik per hari selama 30 hari terakhir (pikirkan dasbor analitik). Jika Anda melakukan itu, select count(...) from ... group by day
Anda akan mendapatkan hitungan untuk setiap hari, tetapi hasilnya hanya akan memiliki satu baris untuk setiap hari Anda benar-benar memiliki setidaknya satu akses. Di sisi lain jika Anda pertama memproyeksikan tabel hari dari tabel angka Anda ( select dateadd(day, -number, today) as day from numbers
) dan kemudian Anda pergi bergabung dengan jumlah (atau menerapkan luar, apa pun yang Anda suka) maka Anda akan mendapatkan hasil yang memiliki 0 untuk perhitungan untuk hari-hari Anda tidak punya akses. Ini hanya satu contoh. Tentu saja, orang mungkin berpendapat bahwa lapisan presentasi dasbor Anda dapat menangani hari-hari yang hilang dan hanya menunjukkan 0 sebagai gantinya, tetapi beberapa alat (mis. SSR) tidak akan bisa menangani ini.
Contoh lain yang pernah saya lihat menggunakan trik seri waktu yang sama (tanggal / waktu +/- nomor) untuk melakukan semua jenis perhitungan jendela. Secara umum, setiap kali dalam bahasa imperatif Anda akan menggunakan for for loop dengan jumlah iterasi yang terkenal, deklaratif dan set sifat SQL dapat menggunakan trik berdasarkan tabel angka.
BTW, saya merasa perlu untuk memanggil fakta bahwa meskipun menggunakan tabel nomor itu terasa seperti eksekusi prosedural penting, jangan jatuh ke dalam kesalahan dari asumsi itu adalah penting. Izinkan saya memberi contoh:
int x;
for (int i=0;i<1000000;++i)
x = i;
printf("%d",x);
Program ini akan menghasilkan 999999, yang dijamin cukup banyak.
Mari kita coba hal yang sama di SQL Server, menggunakan tabel angka. Pertama buat tabel 1.000.000 angka:
create table numbers (number int not null primary key);
go
declare @i int = 0
, @j int = 0;
set nocount on;
begin transaction
while @i < 1000
begin
set @j = 0;
while @j < 1000
begin
insert into numbers (number)
values (@j*1000+@i);
set @j += 1;
end
commit;
raiserror (N'Inserted %d*1000', 0, 0, @i)
begin transaction;
set @i += 1;
end
commit
go
Sekarang mari kita lakukan 'for loop':
declare @x int;
select @x = number
from numbers with(nolock);
select @x as [@x];
Hasilnya adalah:
@x
-----------
88698
Jika Anda sekarang memiliki momen WTF (setelah semua number
adalah kunci utama yang terkelompok!), Triknya disebut pemindaian alokasi alokasi dan saya tidak memasukkannya @j*1000+@i
secara tidak sengaja ... Anda juga bisa menebak dan mengatakan hasilnya karena paralelisme dan itu kadang-kadang mungkin jawaban yang benar.
Ada banyak troll di bawah jembatan ini dan saya sebutkan beberapa di hubung singkat pada boolean operator di SQL Server dan fungsi T-SQL tidak menyiratkan urutan eksekusi tertentu