質問

私は、以下のデータを持つテーブル:

Fiscal Year | Fiscal Quarter | Fiscal Week | Data
2009        | 2              | 22          | 9.5
2009        | 2              | 24          | 8.8
2009        | 2              | 26          | 8.8
2009        | 3              | 28          | 8.8
2009        | 3              | 31          | 9.1
2009        | 3              | 33          | 8.8

私は次を生成するクエリを記述したいと思います:

Fiscal Year | Fiscal Quarter | Fiscal Week | Data | Trend
2009        | 2              | 22          | 9.5  | NULL
2009        | 2              | 24          | 8.8  | -0.7
2009        | 2              | 26          | 8.8  | 0
2009        | 3              | 28          | 8.8  | 0
2009        | 3              | 31          | 9.1  | 0.3
2009        | 3              | 33          | 8.8  | -0.3 

私は、これは簡単な操作を実行して達成することができます知っているが、時には差は3週間ですので、しかし、これは常にシンプルt1.[Fiscal Week] = t2.[Fiscal Week] - 2ではありません、前連結会計週でそれ自体にテーブルのジョインます。

私はこのようなもので簡単に最大のレコードを引くことができます:

SELECT
    MAX(t1.[Fiscal Week]) "LastWeek"
FROM t1
WHERE t1.[Fiscal Year] = 2009
    AND t1.[Fiscal Week] < 31

しかし、それは参加作品を作ってそれを抽象化することになると私は途方に暮れてよ。

どのように私は、「現在のレコードよりも小さい最大の会計週」に自己参加することができますか?

役に立ちましたか?

解決

SQLの2005+でこれを行うには、

最も簡単な方法は、href="http://msdn.microsoft.com/en-us/library/ms189798.aspx" rel="nofollow noreferrer">ランキングに - 単にパーティション/あなたのデータを注文し、各レコード(この場合には、あなたがそのウィンドウの上にfiscalWeekによってfiscalYearと順序によって分割されている)への適切なシーケンスを割り当てる - 次のようになります:

with data as
(
    select  row_number() over (partition by a.fiscalYear order by a.fiscalWeek) as rn,
            a.fiscalYear, a.fiscalQuarter, a.fiscalWeek, a.Data
    from    #TableName a
)
select  a.fiscalYear, a.fiscalQuarter, a.fiscalWeek, a.Data, 
        a.Data - b.Data as Trend
from    data a
left join data b
on      a.fiscalYear = b.fiscalYear
and     a.rn = b.rn + 1
order by a.fiscalYear, a.rn

この特定のクエリはfiscalYearの境界を越えて延長を許可しないだろう - あなたは単に句と「fiscalYear」状態に参加し、代わりに組み合わせてセットを注文する「ことにより、パーティション」ドロップしたいこれらの年の境界を横断する延長したい場合

:fiscalYearとfiscalWeek、このような何かの
with data as
(
    select  row_number() over (order by a.fiscalYear + a.fiscalWeek) as rn,
            a.fiscalYear, a.fiscalQuarter, a.fiscalWeek, a.Data
    from    #TableName a
)
select  a.fiscalYear, a.fiscalQuarter, a.fiscalWeek, a.Data, 
        a.Data - b.Data as Trend
from    data a
left join data b
on      a.rn = b.rn + 1
order by a.rn

他のヒント

この動作しますか?インラインクエリは、一口のビットで、それを行うための良い方法はおそらくあります...

select
  [fiscal year]
, [fiscal quarter]
, [fiscal week]
, [data] 
, (
    select top 1 (i.data - t1.data) from t1 as i
    where i.[fiscal year] >= t1.[fiscal year]
    and i.[fiscal quarter] >= t1.[fiscal quarter]
    and i.[fiscal week] >= t1.[fiscal week]
    and (
          i.[fiscal year] <> t1.[fiscal year]
       or i.[fiscal quarter] <> t1.[fiscal quarter]
       or i.[fiscal week] <> t1.[fiscal week]
    )
    order by [fiscal year] asc, [fiscal quarter] asc, [fiscal week] asc
) as trend
from t1
SQL Server 2005を使用している場合は、

、あなたはCROSS APPLY句を使用することができます。

ここでは、前に現在の行の一つに、会計週の行を返しますテーブル値関数を持っている可能性があります。

CREATE FUNCTION dbo.fn_GetFiscalWeekBeforeThis(@Year AS int, 
  @CurrentWeek as int)
  RETURNS TABLE
AS
RETURN
  SELECT TOP 1 *
  FROM t1
  WHERE [Fiscal Year] = @Year 
  AND [Fiscal Week] < @CurrentWeek
  ORDER BY [Fiscal Week] DESC
GO

そして、

SELECT A.*,
A.Data - B.Data
FROM
t1 A
CROSS APPLY 
   dbo.fn_GetFiscalWeekBeforeThis(A.[Fiscal Year],  
   A.[Fiscal Week]) AS B

編集:私は記事で&IDEなしで見ることにより、SQLを適応していることに注意してください
。 また、私は知らない - それは最初の行のために働くだろうか。

だから、親切にしてください)。

EDIT2:それはまったく動作しない場合は、私に教えてください
。 このことは、知っての私を助ける - 結果をチェックせず、物事を答えることではない。

EDIT3:。私は関数から四半期パラメータの必要性を削除した。

DECLARE @Fiscal TABLE
  ( 
   FiscalYear int
  ,FiscalQuarter int
  ,FiscalWeek int
  ,[Data] decimal(4,1) 
  )

INSERT INTO @Fiscal
          ( FiscalYear, FiscalQuarter, FiscalWeek, [Data] )
SELECT 2009, 2, 22, 9.5 UNION
SELECT 2009, 2, 24, 8.8 UNION
SELECT 2009, 2, 26, 8.8 UNION
SELECT 2009, 3, 28, 8.8 UNION
SELECT 2009, 3, 31, 9.1 UNION
SELECT 2009, 3, 33, 8.8 UNION
SELECT 2010, 1, 1, 9.0 UNION
SELECT 2010, 1, 2, 9.2

;
WITH  abcd
        AS ( SELECT FiscalYear
                   ,FiscalQuarter
                   ,FiscalWeek
                   ,[Data]
                   ,row_number() OVER ( ORDER BY FiscalYear, FiscalWeek ) AS rn
             FROM   @Fiscal
           )
  SELECT  a.FiscalYear
         ,a.FiscalQuarter
         ,a.FiscalWeek
         ,a.[Data]
         ,a.[Data] - b.[Data] AS [Trend]
  FROM    abcd AS a
          LEFT JOIN abcd AS b ON b.rn = ( a.rn - 1 )
  ORDER BY a.FiscalYear
         ,a.FiscalWeek
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top