যখন আপনার 'ডেটা মিসিং' প্রকল্পের প্রয়োজন হয় তখন আমি অনেকগুলি ব্যবহার দেখেছি। যেমন। আপনার একটি টাইম সিরিজ রয়েছে (উদাহরণস্বরূপ অ্যাক্সেস লগ) এবং আপনি গত 30 দিনের জন্য প্রতিদিন হিটের সংখ্যাটি প্রদর্শন করতে চান (বিশ্লেষণ ড্যাশবোর্ড ভাবেন)। আপনি যদি এটি করেন তবে আপনি select count(...) from ... group by day
প্রতিদিনের জন্য গণনাটি পাবেন তবে ফলাফলটিতে প্রতিদিন অন্তত একটি অ্যাক্সেস থাকলে কেবল তার জন্য একটি সারি থাকবে। অন্যদিকে, যদি আপনি প্রথমে আপনার নম্বর টেবিল ( select dateadd(day, -number, today) as day from numbers
) থেকে দিনের একটি টেবিল প্রজেক্ট করেন এবং তারপরে আপনি গণনাগুলির সাথে যোগ দেন (বা বাইরের প্রয়োগ করুন, আপনি যা কিছু কল্পনা করেন) তবে আপনি একটি ফলাফল পাবেন যেটির জন্য আপনার গণনার জন্য 0 রয়েছে কোন প্রবেশাধিকার ছিল। এটি কেবল একটি উদাহরণ। অবশ্যই, কেউ তর্ক করতে পারে যে আপনার ড্যাশবোর্ডের উপস্থাপনা স্তরটি অনুপস্থিত দিনগুলি পরিচালনা করতে পারে এবং পরিবর্তে কেবল 0 দেখায়, তবে কিছু সরঞ্জাম (যেমন, এসএসআরএস) কেবল এটি পরিচালনা করতে সক্ষম হবে না।
অন্যান্য উদাহরণগুলি আমি দেখেছি একই ধরণের টাইম সিরিজ ট্রিকস (তারিখ / সময় +/- সংখ্যা) সমস্ত ধরণের উইন্ডো গণনা করতে। সাধারণভাবে, যখনই একটি অপরিহার্য ভাষায় আপনি পরিচিত সংখ্যার পুনরাবৃত্তিগুলির সাথে লুপের জন্য ব্যবহার করেন, এসকিউএল এর ঘোষণামূলক এবং সেট প্রকৃতি কোনও সংখ্যা সারণির উপর ভিত্তি করে একটি কৌশল ব্যবহার করতে পারে।
BTW, আমি সত্য যে এমনকি একটি সংখ্যা টেবিল এটি ব্যবহার যদিও কল আউট প্রয়োজন বোধ মতানুযায়ী অনুজ্ঞাসূচক পদ্ধতিগত সঞ্চালনের মতো অভিমানী এটি ভ্রান্ত ধারণা পড়া না হয় অনুজ্ঞাসূচক। আমাকে একটি উদাহরণ দিতে দাও:
int x;
for (int i=0;i<1000000;++i)
x = i;
printf("%d",x);
এই প্রোগ্রামটি 999999 আউটপুট দেবে, এটি বেশ গ্যারান্টিযুক্ত।
একটি সংখ্যা সারণী ব্যবহার করে এসকিউএল সার্ভারে একই চেষ্টা করা যাক। প্রথমে 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
এখন 'লুপের জন্য' করুন:
declare @x int;
select @x = number
from numbers with(nolock);
select @x as [@x];
ফলাফল হলো:
@x
-----------
88698
আপনি এখন একজন ডব্লিউটিএফ মুহূর্ত থাকার তাহলে করছি (পরে number
হয় ক্লাস্টার প্রাথমিক কী!), কৌতুক বলা হয় বরাদ্দ অর্ডার স্ক্যান এবং আমি সন্নিবেশ করা হয়নি @j*1000+@i
দৃর্ঘটনায় ... এছাড়াও আপনি একটি অনুমান venture এবং বলে ফলাফলের কারণ ছিল পারে সমান্তরালতা এবং এটি কখনও কখনও সঠিক উত্তর হতে পারে।
এই ব্রিজের নীচে অনেকগুলি ট্রল রয়েছে এবং আমি কিছু অন এসকিউএল সার্ভার বুলেয়ান অপারেটর শর্ট সার্কিট এবং টি-এসকিউএল ফাংশনগুলিতে মৃত্যুদন্ড কার্যকর করার কোনও নির্দিষ্ট আদেশ বোঝায় না