הבלוג של גרי רשף

22/07/2011

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

Filed under: Uncategorized — תגיות: , , — גרי רשף @ 20:18

נשאלתי בפורום בסיסי נתונים בתפוז כיצד לבצע 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.

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

מודעות פרסומת

להגיב »

עדיין אין תגובות.

RSS feed for comments on this post. TrackBack URI

כתיבת תגובה

הזינו את פרטיכם בטופס, או לחצו על אחד מהאייקונים כדי להשתמש בחשבון קיים:

הלוגו של WordPress.com

אתה מגיב באמצעות חשבון WordPress.com שלך. לצאת מהמערכת / לשנות )

תמונת Twitter

אתה מגיב באמצעות חשבון Twitter שלך. לצאת מהמערכת / לשנות )

תמונת Facebook

אתה מגיב באמצעות חשבון Facebook שלך. לצאת מהמערכת / לשנות )

תמונת גוגל פלוס

אתה מגיב באמצעות חשבון Google+ שלך. לצאת מהמערכת / לשנות )

מתחבר ל-%s

יצירה של אתר חינמי או בלוג ב־WordPress.com.

%d בלוגרים אהבו את זה: