0

日付ごとにサンプリングされたさまざまなオブジェクトへのリクエスト数を返すクエリがあります。1日に複数のサンプラーが存在する可能性があります。最初のWith部分は、毎日最新のサンプルのみを取得するために使用されます。

With RankedSamples As
    (
    Select  Id, runend
        , ROW_NUMBER() OVER( PARTITION BY convert(varchar , runEnd, 1) ORDER BY runEnd DESC ) ItemRank
    From t_SamplesRuns
    where runend > '05/13/12' and runend < '05/18/12'
    )

select sum(TotalRequests) Hits, 
       convert(nvarchar(10), day(smp.date)) + '-' + 
       convert(nvarchar(10), month(smp.date)) + '-' + 
       convert(nvarchar(10), year(smp.date)) date
from t_samples smp
where  smp.runid in (                 
    select id                 
    from RankedSamples                 
    where ItemRank = 1  
    )    

group by convert(nvarchar(10), day(smp.date)) + '-' + 
         convert(nvarchar(10), month(smp.date)) + '-' + 
         convert(nvarchar(10), year(smp.date))

これが返すものは、例えば:

Hits     date
111111   13-5-2012
222222   14-5-2012
333333   15-5-2012
444444   16-5-2012
555555   17-5-2012

返す必要があるのは、これらのフィールド+前日のヒット数とその減算(最初の行は関係ありません)です。

Hits     date       Prev     Res
111111   13-5-2012  0        111111
222223   14-5-2012  111111   111112
333335   15-5-2012  222223   111113 
444447   16-5-2012  333335   111114
555559   17-5-2012  444447   111115

何か案は?ありがとう!

4

1 に答える 1

2

SQL Server 2012を使用していないと仮定すると、実行しようとしているのはラグ関数を実装することです。残念ながら、これを行う最も簡単な方法は、自己参加を使用することです。だから、私はこれを行うためにあなたのクエリを書き直すつもりです:

With RankedSamples As (
      Select Id, runend,
             ROW_NUMBER() OVER( PARTITION BY convert(varchar , runEnd, 1) ORDER BY runEnd DESC) as ItemRank
      From t_SamplesRuns
      where runend > '05/13/12' and runend < '05/18/12'
    )
     Results as (
      select sum(TotalRequests) Hits,
             convert(nvarchar(10), day(smp.date)) + '-' +  convert(nvarchar(10), month(smp.date)) + '-' +         convert(nvarchar(10), year(smp.date)) as date
      from t_samples smp where  smp.runid in (select id from RankedSamples where ItemRank = 1)
      group by convert(nvarchar(10), day(smp.date)) + '-' +  convert(nvarchar(10), month(smp.date)) + '-' +  convert(nvarchar(10), year(smp.date)
    ),
     Results2 as (
         select r.*, row_number() over (partition by null order by date) as rownum
         from Results
    )
select r.hits, r.date, rprev.hits, r.hits - rprev.hits
from Results2 r left outer join
     Results2 rprev
     on r.rownum = rprev.rownum+1

私が言ったように、これはSQL Server 2012の方が簡単です。これは、ウィンドウ関数がOracleの分析関数に似ているためです。

于 2012-05-22T14:20:02.007 に答える