ביצוע Count Distinct ללא תמיכה מתאימה

22/07/2011

אין תגובות

נשאלתי בפורום בסיסי נתונים בתפוז כיצד לבצע Count Distinct באקסס, כלי שאינו תומך באופציה זו.
אנחנו אנשי SQL Server יכולים להריץ בקלות שאילתה בסגנון של-

Select  Schema_id,

        Count(Distinct Type) Count_Dist_Type

From    sys.objects

Group By Schema_id;

clip_image002

שאילתה הסופרת כמה סוגים שונים של אובייקטים יש בכל סכימה (למשל- בסכימה 4=sys יש שני סוגים- INTERNAL_TABLE, SYSTEM_TABLE).

אם בבוקר אחד נגלה שמישהו הזיז את ה-Count distinct שלנו וכעת עלינו להסתדר בלעדיו- נוכל לעשות זאת כך-

Select  Schema_id,

        Count(Type) Count_Dist_Type

From    (Select Schema_id,

                Type

        From    sys.objects

        Group By Schema_id,

                Type) T

Group By Schema_id;

clip_image004

בשלב ראשון ביצענו Group By לפי Schema_id ו-Type (וכעת לכל Schema_id יש רשומות כמספר ה-Type השונים שלה),

ובשלב שני ביצענו Group By לפי Schema_id וספרנו כמה Type יש.

עד כאן – מעניין מאוד, אבל שימושי לאנשי אקסס ולא לנו, אלא שגם אנחנו לא יכולים לעשות כל מה שאנחנו רוצים, למשל – להשתמש ב-Count Distinct בתור פונקציית חלון, למשל-

Select Count(Distinct Type) Over(Partition By Schema_id) Count_Type,

       *

From   sys.objects;

clip_image006

ניסינו להוסיף לשליפה מהטבלה עמודה נוספת המציינת כמה Type שונים יש ל-Schema_id שלה, ומתברר שהמערכת אינה תומכת באופציה הזו.

מה עושים?

גם כאן נוכל לבצע זאת בשני שלבים נפרדים, למשל כך-

Select  Count(Case When Count_Type=1 Then 1 End) Over(Partition By Schema_id) Count_Dist_Type,

        *

From    (Select Row_Number() Over(Partition By Schema_id,Type Order By name) Count_Type,

                *

        From    sys.objects) T;

clip_image008

נמספר את הרשומות עבור כל צירוף של Schema_id ו-Type,

ולאחר מכן נספור כמה Type=1 יש לכל Schema_id.

כמובן שיש דרכים נוספות לבצע זאת.

הוסף תגובה
facebook linkedin twitter email

כתיבת תגובה

האימייל לא יוצג באתר. שדות החובה מסומנים *