টেবুলার মডেলটিতে শীর্ষ 10 গণনা / সঞ্চয় কিভাবে করবেন?


23

আমরা সম্প্রতি একটি এসএসএএস ট্যাবুলার মডেল তৈরি করেছি যাতে আমাদের ব্যবহারকারীরা পাওয়ারভিউয়ের মাধ্যমে এটি অ্যাক্সেস করতে পারে। 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টিকে গণনা / সঞ্চয় করতে পারি এবং এখনও আমাদের টবুলার মডেলটিতে প্রয়োজনীয়ভাবে ডেটা বিচ্ছিন্ন করতে সক্ষম হতে পারি?

উত্তর:


1

আমার অনুরূপ দৃশ্য ছিল এবং নিম্নলিখিত DAX ক্যোয়ারী ব্যবহার করেছি ...

প্রথমত, এটি সহজ করার জন্য, আমি DAX এর ভিতরে ব্যবহারের জন্য একটি পরিমাপ সংজ্ঞায়িত করেছি যাতে সূত্রটি পুনরাবৃত্তি করতে না হয়। তারপরে আমি টপএন সূত্রটিতে পুনরুক্তি করতে জেনারেটটি ব্যবহার করেছি:

define measure TableInTabular[NameOfTheMeasure] = COUNTAX(FILTER('Stats', ISBLANK([DeactDate]) = TRUE), 1)
evaluate
 (
  addcolumns
   (  
    filter
     (  
      generate
        (  
         VALUES(DatesTableName[Month]),  
         TOPN (10, VALUES(TableInTabular[ParentID]),TableInTabular[NameOfTheMeasure],0)
        ),
        TableInTabular[NameOfTheMeasure]>0
      ),
      "ActiveCount (or how you want to call this Column)",
      TableInTabular[NameOfTheMeasure]  
    )  
 )  
order by DatesTableName[Month] asc, 
TableInTabular[NameOfTheMeasure] desc

উপরের সাথে প্রতি মাসে আপনার মধ্যে শীর্ষ 10 প্যারেন্টআইডি এবং পরিমাপ করা উচিত। কেবলমাত্র আপনার টেবিলার টেবিলের নামের সাথে "টেবিলইনট্যাবুলার" প্রতিস্থাপন করুন যেখানে আপনার কাছে ডেটা রয়েছে এবং তারিখের সারণির নামের সাথে "তারিখ টেবিলনাম" রয়েছে।

আমি যদি আপনার প্রশ্নটি ভুল বুঝি এবং আমাকে আশা করি এটি সাহায্য করে ...


1
উত্তরের জন্য ধন্যবাদ, এটি নিয়ে এখনও কিছু সমস্যা রয়েছে। প্রথমত, আমি এটি এসএসএমএসের অভ্যন্তরে ব্যবহার করতে পারি তবে এটি আমাদের টবুলার মডেলটিতে স্থাপন করা হচ্ছে যাতে আমাদের ব্যবহারকারীরা পাওয়ারভিউয়ের মাধ্যমে এটি অ্যাক্সেস করতে পারে - তারা কোনও প্রশ্ন লিখবে না - এটি কেবল উপলব্ধ হওয়া দরকার। দ্বিতীয়ত, আমি যদি কিছু ভুল করে না করি তবে ভিজ্যুয়াল স্টুডিওর মাধ্যমে ট্যাবুলার মডেলটিতে অনুমোদিত বা মূল্যায়ন করার কোনও আদেশ নেই - একটি কার্য হিসাবে এটির জন্য কোনও বিকল্প নেই। তৃতীয়ত, এই ক্যোয়ারীটি কেবল শীর্ষ 10 প্রদান করে, আমার কাছে রোলড ডেটা বা এটি পাওয়ার কোনও উপায়ও প্রয়োজন। আমি যদিও এ নিয়ে চারপাশে খেলা চালিয়ে যাব।
Taryn
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.