SQL Server: obtenga la suma restada por la suma de la fila anterior

Tengo una consulta que devuelve el número de solicitudes a diferentes objetos muestreados por fecha, puede haber más de una muestra por día. la parte Con al principio se usa para obtener solo la última muestra cada día.

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))

lo que esto devuelve es por ejemplo:

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

lo que necesito que devuelva son estos campos + el número de visitas del día anterior y su resta (primera fila irrelevante):

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

¿algunas ideas? ¡Gracias!

preguntado el 22 de mayo de 12 a las 15:05

1 Respuestas

Suponiendo que no está utilizando SQL Server 2012, lo que intenta hacer es implementar una función de retraso. Desafortunadamente, la forma más fácil de hacer esto es con una autounión. Entonces, voy a reescribir su consulta para hacer esto:

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

Como dije, esto es más fácil en SQL Server 2012, porque las funciones de ventana son más similares a las funciones analíticas de Oracle.

contestado el 22 de mayo de 12 a las 15:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.