计算周的运行计数

时间:2015-07-08 21:19:54

标签: sql sql-server sql-server-2012

我希望计算从起点开始的周数的运行计数。这里最大的问题是我正在处理的日历不是传统的公历。

最容易引用的维度就像' TWEEK'它实际上告诉你记录属于一年中的那一周。

示例数据:

RelativeLayout

为了方便起见,我没有一路走到52,但你明白了。我正在尝试重新制作“CumWEEK'柱。根据奇怪的日历惯例(' TWEEK'),我已经有一个专栏告诉我一年中正确的一周。

我知道这会涉及某种OVER()窗口,但我似乎无法弄明白。

2 个答案:

答案 0 :(得分:2)

几分钟前我回答了一个不同的问题,这是一个类似的问题 https://stackoverflow.com/a/31303395/5089204

这个想法大致是创建一个正在运行的数字表,并用模7找到周数。这可以用作OVER子句中的分组......

编辑:示例

CREATE FUNCTION dbo.RunningNumber(@Counter AS INT)
RETURNS TABLE
AS
RETURN
SELECT TOP (@Counter) ROW_NUMBER() OVER(ORDER BY o.object_id) AS RunningNumber
FROM sys.objects AS o; --take any large table here...
GO

SELECT 'test',CAST(numbers.RunningNumber/7 AS INT)
FROM dbo.RunningNumber(100) AS numbers

除以7"为INT"提供了一个非常好的分组标准。

希望这会有所帮助......

答案 1 :(得分:2)

窗口函数LAG()以及ORDER BY ROWS BETWEEN“更改”的总和应该让您足够接近使用。需要注意的是ORDER BY ROWS BETWEEN只能取整数字面值。

年度滚动:我猜您可以根据模式52创建另一个排名级别,以开始计算新鲜。所以53岁将成为第2周,第1周,而不是53岁。

SELECT
    *   ,
    SUM(ChangedRow) OVER (ORDER BY DateKey ROWS BETWEEN 99999 PRECEDING AND CURRENT ROW)    
FROM
(
    SELECT 
        DateKey,
        TWEEK,  
        ChangedRow=CASE WHEN LAG(TWEEK) OVER (ORDER BY DateKey) <> TWEEK THEN 1 ELSE 0 END          

    FROM 
        @foobar F2
)AS DETAIL