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
Post a Comment