ฉันเห็นการใช้งานหลายอย่างเมื่อคุณต้องการฉาย 'ข้อมูลที่หายไป' เช่น. คุณมีอนุกรมเวลา (บันทึกการเข้าใช้เป็นต้น) และคุณต้องการแสดงจำนวนครั้งต่อวันสำหรับ 30 วันที่ผ่านมา (คิดว่าแผงควบคุมการวิเคราะห์) ถ้าคุณทำselect count(...) from ... group by day
คุณจะได้รับการนับทุกวัน แต่ผลลัพธ์จะมีแถวสำหรับแต่ละวันที่คุณมีการเข้าถึงอย่างน้อยหนึ่งครั้ง ในทางตรงกันข้ามถ้าคุณฉายตารางวันแรกจากตารางตัวเลขของคุณ ( select dateadd(day, -number, today) as day from numbers
) จากนั้นคุณออกจากการเข้าร่วมกับการนับ (หรือการสมัครนอกสิ่งที่คุณจินตนาการ) จากนั้นคุณจะได้รับผลลัพธ์ที่มี 0 สำหรับการนับวันที่คุณ ไม่มีสิทธิ์เข้าถึง นี่เป็นเพียงตัวอย่างเดียว แน่นอนหนึ่งอาจยืนยันว่าเลเยอร์การนำเสนอของแดชบอร์ดของคุณสามารถจัดการกับวันที่หายไปและแสดงเพียง 0 แทน แต่เครื่องมือบางอย่าง (เช่น SSRS) จะไม่สามารถจัดการสิ่งนี้ได้
ตัวอย่างอื่น ๆ ที่ฉันเคยเห็นใช้เทคนิคอนุกรมเวลาที่คล้ายคลึงกัน (วันที่ / เวลา +/- หมายเลข) เพื่อทำการคำนวณหน้าต่างทั้งหมด โดยทั่วไปเมื่อใดก็ตามที่มีความจำเป็นในการใช้ภาษาคุณจะต้องใช้ for for loop ที่มีจำนวนการวนซ้ำที่รู้จักกันดีการประกาศและการกำหนดลักษณะของ SQL สามารถใช้เคล็ดลับตามตารางตัวเลขได้
BTW ผมรู้สึกว่าต้องเรียกความจริงที่ว่าถึงแม้การใช้ตารางตัวเลขมันรู้สึกเหมือนการดำเนินการขั้นตอนความจำเป็นไม่ตกอยู่ในการเข้าใจผิดของสมมติว่ามันเป็นความจำเป็น ขอยกตัวอย่าง:
int x;
for (int i=0;i<1000000;++i)
x = i;
printf("%d",x);
โปรแกรมนี้จะออก 999999 ที่รับประกันค่อนข้างสวย
ลองแบบเดียวกันใน SQL Server โดยใช้ตารางตัวเลข สร้างโต๊ะ 1,000,000 หมายเลขก่อน:
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
ตอนนี้ให้ทำ 'for loop':
declare @x int;
select @x = number
from numbers with(nolock);
select @x as [@x];
ผลลัพธ์คือ:
@x
-----------
88698
หากคุณมีช่วงเวลา WTF (หลังจากทั้งหมดnumber
เป็นคีย์หลักแบบคลัสเตอร์!) เคล็ดลับนี้เรียกว่าการสแกนคำสั่งการจัดสรรและฉันไม่ได้แทรก@j*1000+@i
โดยบังเอิญ ... คุณอาจลองเดาและบอกว่าผลลัพธ์เป็นเพราะความเท่าเทียมและบางครั้งอาจเป็นคำตอบที่ถูกต้อง
มีโทรลล์จำนวนมากภายใต้บริดจ์นี้และฉันได้กล่าวถึงบางอย่างในฟังก์ชั่นลัดวงจรของตัวดำเนินการบูลีนเซิร์ฟเวอร์ SQLและฟังก์ชัน T-SQL ไม่ได้บอกเป็นนัยถึงการดำเนินการบางอย่าง