我在当天的粒度上有源数据,我需要将其汇总到周粒度。大多数字段都是简单的汇总聚合。但是,我有一个领域,我需要采取星期日的价值(有点像“第一”聚合)和另一个领域,我需要采取星期六的价值。
我使用SSIS的目的是将源数据多播三次,为简单字段执行常规聚合,然后使用查找联接到日历表以将其他两个分别与星期六和星期日相匹配抓住这些价值......然后将所有东西合并在一起。
有更好的方法吗?
示例源数据:
输出应该是什么样的:
答案 0 :(得分:2)
您可以使用First_value和Last_Value,如下所示:
select top 1 with ties datepart(week, [day]) as [Week],
sum(sales) over(partition by datepart(week, [day])) as Sales,
FIRST_VALUE(BOP) over(partition by datepart(week, [day]) order by [day]) as BOP
, EOP = LAST_VALUE(EOP) over(partition by datepart(week, [day]) order by [day] RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING )
from #youraggregate
Order by Row_number() over(partition by datepart(week, [day]) order by [day])
答案 1 :(得分:2)
有更好的方法吗?是。不要将复杂的SSIS解决方案用于简单的SQL语句
SELECT
Day,
SUM(Sales) Sales,
MAX(
CASE WHEN DATEPART(dw,Day) = 1 THEN BOP ELSE NULL END
) As BOP,
MAX(
CASE WHEN DATEPART(dw,Day) = 7 THEN EOP ELSE NULL END
) As EOP
FROM Table
GROUP BY Table
您可能需要调整1和7,具体取决于您的服务器设置,但希望您明白这一点。
答案 2 :(得分:1)
使用派生列转换来获得第一周
DATEPART("wk", Day)
之后使用聚合使用周列