|  |  | Archives of the TeradataForumMessage Posted: Fri, 04 Feb 2011 @ 16:47:01 GMT
 
 
  
| Subj: |  | Re: Avoid distinct |  |  |  | From: |  | Curley, David |  
 It may or not be faster than count distinct, but you can use an ordered analytic function to find the "first" row with a new C1 + C4
combination and use that to generate the equivalent of a distinct count. This uses sys_calendar.calendar fields in place of your C1...C4 (month_of_year is C4): 
     select day_of_week, sum(day_of_calendar), count(day_of_year),
     sum(is_first)
     from
     (select day_of_week, day_of_calendar, day_of_year, case when row_number() over
     (partition by day_of_week, month_of_year order by 1) = 1 then 1 else 0 end
     is_first from sys_calendar.calendar where day_of_calendar < 500) x group by 1;
 I couldn't get the other suggestion (sel c1,sum(c2),count(c3),count(c4) over(partition by c1 order by 1) from vt1 group by c1,c4;) to
work as is, but you could wrap it to get the same output: 
     select day_of_week, sum(doc), sum(doy), min(moy)
     from
     (sel day_of_week,sum(day_of_calendar) doc,count(day_of_year) doy,
         count(month_of_year) over(partition by day_of_week) moy
         from sys_calendar.calendar
         where  day_of_calendar < 500
         group by day_of_week,month_of_year) x
     group by 1;
 The second one might be faster since it doesn't require any ordering (I removed the order by in the partition since it doesn't change the
count). 
 Dave 
 
 |  |