sql - Include date boundaries to segment select results -


i want return in same row results of particular measure on different time range. instance "last 30 days", "last 7 days", "last 3 days". on doing i've used union function, , created multiple sub-queries every time range. downside of doing i'm collecting same numbers 3 times, consequent increase in running time.

a colleague suggested me use case function segment time range. i've thought implement follows:

select tp.name,      case when pub.date between dateadd(day, -31, getdate()) , dateadd(day, -1, getdate())          sum(impressions) else 0 end 'last 30 days impressions',     case when pub.date between dateadd(day, -31, getdate()) , dateadd(day, -1, getdate())          sum(revenue * rler.rate) else 0 end 'last 30 days revenues',     case when pub.date between dateadd(day, -8, getdate()) , dateadd(day, -1, getdate())          sum(impressions) else 0 end 'last 7 days impressions',     case when pub.date between dateadd(day, -8, getdate()) , dateadd(day, -1, getdate())          sum(revenue * rler.rate) else 0 end 'last 7 days revenues',     case when pub.date between dateadd(day, -4, getdate()) , dateadd(day, -1, getdate())          sum(impressions) else 0 end 'last 3 days impressions',     case when pub.date between dateadd(day, -4, getdate()) , dateadd(day, -1, getdate())          sum(revenue * rler.rate) else 0 end 'last 3 days revenues'  ...  ...  group tp.name, tp.kind, pub.date  order 'last 30 days impressions' 

unfortunately return row each name, kind , date not want. issue think relies on pub.date in group by call. should overcome issue?

you can't quite implement colleague's suggestion because times overlap. can non-overlapping ranges, this:

select tp.name,          (case when pub.date between dateadd(day, -3, getdate()) , dateadd(day, -1, getdate())                'last 3 days impressions'               when pub.date between dateadd(day, -7, getdate()) , dateadd(day, -1, getdate())                '4-7 days impressions'               when pub.date between dateadd(day, -31, getdate()) , dateadd(day, -1, getdate())                '8-31 days impressions'               else 'older'          end) timerange,        sum(impressions) numimpressions,        . . .  . . . . . . group tp.name,           (case when pub.date between dateadd(day, -3, getdate()) , dateadd(day, -1, getdate())                 'last 3 days impressions'                when pub.date between dateadd(day, -7, getdate()) , dateadd(day, -1, getdate())                 '4-7 days impressions'                when pub.date between dateadd(day, -31, getdate()) , dateadd(day, -1, getdate())                 '8-31 days impressions'                else 'older'           end) 

Comments

Popular posts from this blog

android - Get AccessToken using signpost OAuth without opening a browser (Two legged Oauth) -

org.mockito.exceptions.misusing.InvalidUseOfMatchersException: mockito -

google shop client API returns 400 bad request error while adding an item -