আমরা সম্প্রতি একটি এসএসএএস ট্যাবুলার মডেল তৈরি করেছি যাতে আমাদের ব্যবহারকারীরা পাওয়ারভিউয়ের মাধ্যমে এটি অ্যাক্সেস করতে পারে। TotalActiveItems
সূত্রটি ব্যবহার করার জন্য আমাদের একটি ফ্যাক্ট টেবিলে একটি পরিমাপ রয়েছে :
TotalActive:=COUNTAX(FILTER('Stats', ISBLANK([DeactDate]) = TRUE), 1)
এটি প্রয়োজন হিসাবে দুর্দান্ত কাজ করে তবে এখন প্রতি মাসে আমাদের জন্য সেরা 10 জন পিতামাতাকে পেতে অনুরোধ রইল TotalActive
।
রেফারেন্সের জন্য, এখানে আমাদের মডেলের অংশ:
create table factStats
(
StatsID INT IDENTITY NOT NULL PRIMARY KEY,
DevID INT NOT NULL,
DeactDate DATETIME NULL,
BillDateTimeID BIGINT NOT NULL,
CustID INT NOT NULL,
ParentID INT NOT NULL
);
create table dimCust
(
CustID INT NOT NULL PRIMARY KEY,
CustName varchar(150) NOT NULL
);
create table dimParent
(
ParentID INT NOT NULL PRIMARY KEY,
ParentName varchar(100) NOT NULL
);
create table dimDateTime
(
DateTimeID BIGINT NOT NULL PRIMARY KEY
);
টেবিল এবং নমুনা ডেটা সহ এসকিউএল ফিডল ।
factStats
টেবিলে FKs হয়েছে DevID
, CustID
, BillDateTimeID
, এবং ParentID
। অনুরোধ আছে যে আমরা পারেন নিরূপণ করা নয় অথবা সংরক্ষণ Top 10 Parents
প্রত্যেকের জন্য BillDateTimeID
উপর ভিত্তি করে TotalActive
এবং নিম্নলিখিত অনুরূপ একটি গুটান বিষয়শ্রেণীতে অন্তর্ভুক্ত শীর্ষ 10 মধ্যে সবকিছু অন্তর্ভুক্ত:
+----------------+------------+------+
| BillDateTimeID | Parent | Rank |
+----------------+------------+------+
| 20140801 | Jim | 1 |
| 20140801 | Bob | 2 |
| 20140801 | All Others | 3 |
+----------------+------------+------+
আমি উইন্ডোটিং ফাংশনগুলি ব্যবহার করে এসকিউএলে সহজেই এটি সম্পাদন করতে পারি তবে এসএসএএসের জন্য এটি পুনরুত্পাদন করার চেষ্টা করা কঠিন হয়ে পড়েছে। এসকিউএলে, আমরা ফলাফলটি পেয়ে যাব:
;with Total as
(
select
ParentID,
BillDateTimeID,
sum(case when DeactDate is null then 1 else 0 end) TotalActive
from factStats
group by ParentID, BillDateTimeID
),
PRank as
(
select
ParentID,
BillDateTimeID,
TotalActive,
row_number() over(partition by BillDateTimeID
order by TotalActive desc) pr
from total
)
select
parentid,
BillDateTimeID,
TotalActive,
pr
from prank
where pr <= 2
union all
select
0,
BillDateTimeID,
sum(TotalActive) TotalActive,
3
from prank
where pr > 2
group by BillDateTimeID
order by BillDateTimeID desc, pr;
আমি ফলাফলটি পেতে বিভিন্ন উপায়ে চেষ্টা করেছি তবে প্রত্যেকেরই একটি সমস্যা রয়েছে। আমার চেষ্টা নীচে আছে।
প্রাথমিকভাবে, আমি এমডিএক্স ক্যোয়ারীটি ব্যবহার করে কিছুটা উপাত্ত পেতে সক্ষম হয়েছি কিন্তু তখন এটি আমাদের টবুলার মডেলটিতে কীভাবে অন্তর্ভুক্ত করা যায় সে সম্পর্কে কোনও ধারণা ছিল না। রেফারেন্সের জন্য MDX ক্যোয়ারী হ'ল:
with
set [Top10Parent] AS
(
(TOPCOUNT({ORDER(({[Parent].[Parent Name].[Parent Name]}),
([Measures].[Total Count]), BDESC)}, 10))
)
MEMBER [Parent].[Parent Name].[Others] AS
(
AGGREGATE(EXCEPT([Parent].[Parent Name].[Parent Name], [Top10Parent]))
)
select
[Measures].[Total Count] on columns,
{[Top10Parent]}+ {[Parent].[Parent Name].[Others]} on Rows
from [OurModel]
where {[Date and Time].[Month and Year].[Month and Year].[Jul 2014]};
অবশ্যই, এটি আমাকে কেবলমাত্র এক মাসের জন্য ফলাফল দিয়েছে, প্রতি মাসে নয়।
যখন আমি বুঝতে পেরেছি যে এমডিএক্স ক্যোয়ারি কাজ করবে না, তখন আমি factStats
শীর্ষস্থানীয় 10 এবং রোলড আপ মানের আইটেমগুলিকে পতাকাঙ্কিত করতে একটি নতুন কলাম অন্তর্ভুক্ত করার জন্য আমাদের টেবিলটি পরিবর্তন করে শুরু করেছি ।
alter table factStats
add Top10ParentID INT NOT NULL
constraint DF_factStats default (0);
ডিফল্ট সীমাবদ্ধতা শীর্ষ দশের জন্য আমাদের "রোলড আপ" মানকে উল্লেখ করে।
চেষ্টা # 1: আমি প্যারেন্টআইডি, নাম এবং র্যাঙ্ক সংরক্ষণ করতে নতুন শীর্ষ 10 টেবিল তৈরি করেছি:
create table dimTop10Parent
(
Top10ParentID INT NOT NULL PRIMARY KEY,
ParentName varchar(100) NOT NULL,
Parent_Rank INT NOT NULL
);
এই টেবিলটি তখন প্রতিবার পপুলেট করা হবে যখনই আমরা তাদের সাথে থাকা মোট সক্রিয় আইটেমগুলির উপর ভিত্তি করে নতুন শীর্ষ 10 পিতামাতার সাথে আমাদের মডেলটিকে রিফ্রেশ করব। দ্যParent_Rank
কলাম তাহলে আমাদের ট্যাবুলার মডেল লুকানো এবং বাছাই জন্য একচেটিয়াভাবে ব্যবহার করা হয়। এটি দুর্দান্ত কাজ করে, কেবলমাত্র আমাদের কাছে দশটি getতিহাসিকভাবে পাওয়ার ক্ষমতা নেই কারণ এটি এক মাস থেকে মাসের ভিত্তিতে নয়।
চেষ্টা # 2: শীর্ষ 10 টি সংরক্ষণ করার জন্য একটি নতুন টেবিল তৈরি করুন তবে প্রাথমিক কীতে শীর্ষ 10 প্যারেন্টআইডি এবং একটি বিলিংডেটটাইম উভয়ই অন্তর্ভুক্ত থাকবে।
create table dimTop10Parent
(
Top10ParentID INT NOT NULL,
ParentName varchar(100) NOT NULL,
Parent_Rank INT NOT NULL,
BillDateTimeID BIGINT NOT NULL
);
এটির সাথে সমস্যাটি হ'ল আমরা টেবুলার মডেলটির ডিমেটপ 10 প্যারেন্টে ফ্যাক্টস্ট্যাটস সিঙ্গলাল এফকে দুটি অংশ পিকে-র মধ্যে সম্পর্ক তৈরি করতে পারি না।
চেষ্টা # 3: নতুন টেবিল তৈরি করুন তবে পিকে হিসাবে একটি পরিচয় ব্যবহার করুন।
create table dimTop10Parent
(
Top10ID INT IDENTITY NOT NULL PRIMARY KEY,
Top10ParentID INT NOT NULL,
ParentName varchar(100) NOT NULL,
Parent_Rank INT NOT NULL,
BillDateTimeID BIGINT NOT NULL
);
factStats
টেবিল সংরক্ষণ করবে Top10ID
মান যা প্রতিটি সারির জন্য অনন্য হতে হবে। আমি ভেবেছিলাম এটি আমার সমস্যার সমাধান করবে তবে, এটি এমনটি হয়নি কারণ আমরা আর Parent_Rank
মডেলটির দ্বারা বাছাই করতে পারি না , এটি একটি ত্রুটি নিক্ষেপ করে:
প্যারেন্ট_রঙ্ক দ্বারা প্যারেন্টনামকে বাছাই করা যায় না কারণ প্যারেন্টনেমে কমপক্ষে একটি মানের প্যারেন্ট_র্যাঙ্কে একাধিক স্বতন্ত্র মান থাকে। উদাহরণস্বরূপ, আপনি [অঞ্চল] অনুসারে [সিটি] বাছাই করতে পারেন কারণ প্রতিটি শহরের জন্য একটিই অঞ্চল আছে তবে আপনি [অঞ্চল] [সিটি] দ্বারা বাছাই করতে পারবেন না কারণ প্রতিটি অঞ্চলের জন্য একাধিক নগর রয়েছে।
নমুনা ডেটা ব্যবহার করে চূড়ান্ত ফলাফলের সমান হওয়া উচিত (এটি 3 য় রোলড আপের সাথে শীর্ষ 2 দেখায়):
| PARENTNAME | BILLDATETIMEID | TOTALACTIVE | PR |
|------------|----------------|-------------|----|
| FDN | 201408010000 | 11 | 1 |
| FDO | 201408010000 | 3 | 2 |
| All Others | 201408010000 | 5 | 3 |
| FDN | 201407010000 | 12 | 1 |
| EVOD | 201407010000 | 2 | 2 |
| All Others | 201407010000 | 5 | 3 |
এই মুহুর্তে, আমি কীভাবে এই চূড়ান্ত ফলাফলটি পাব তার ক্ষতিতে আছি। আমি টেবিলগুলি এটির জন্য প্রয়োজনীয় হিসাবে পরিবর্তন করতে পারি, আমি সূত্র, পরিমাপ ইত্যাদি ব্যবহার করে মডেলটি পরিবর্তন করতে পারি আমি DAX সূত্র 1 , 2 , 3 ব্যবহার করে র্যাঙ্কিং সম্পর্কে পড়েছি তবে আমি আমার মাথাটি জড়িয়ে রাখতে পারি না বলে মনে করি এগুলি যথাযথভাবে ফলাফল পেতে সক্ষম হতে যথেষ্ট।
আমি কীভাবে কোনও মাসের জন্য এই শীর্ষ 10টিকে গণনা / সঞ্চয় করতে পারি এবং এখনও আমাদের টবুলার মডেলটিতে প্রয়োজনীয়ভাবে ডেটা বিচ্ছিন্ন করতে সক্ষম হতে পারি?