Znalazłem rozwiązanie podziału na zmiany w swoich starszych zapytaniach.
No więc będzie to tak wyglądało
with rn as (
select
*
, row_number() over (order by LUD) r
from
dt
)
, d as (
select
n.lud
, p.r pr
, n.r nr
, p.lud od
, n.lud do
, p.wynikoperacji pwo
, n.wynikoperacji nwo
,datediff(ms,p.lud,n.lud)/1000.0 czas
,n.wynikoperacji elementy
from
rn p
inner join rn n on p.r+1 = n.r
)
/* podglad danych do raportu
select * from d
*/
select
DATEPART(YEAR,DATEADD(YEAR,CASE WHEN (DATEPART(HH,LUD)<6 and
DATEPART(dd,LUD)=1 and datepart(mm,lud)=1) THEN -1 ELSE 0 END,lud)) rok
,DATEPART(MONTH,DATEADD(MONTH,CASE WHEN (DATEPART(HH,LUD)<6 and DATEPART(dd,LUD)=1) THEN -1 ELSE 0 END,lud)) miesiac
,DATEPART(DAY,DATEADD(DAY,CASE WHEN DATEPART(HH,LUD)<6 THEN -1 ELSE 0 END,lud)) dzien
,datepart(hour, dateadd(hour,-6,LUD))/8+1 zmiana
,sum(case when czas<7 then czas else 0 end) normalna_praca
,sum(case when czas between 7 and 60 then czas else 0 end) mikroprzestoje
,sum(case when czas>60 then czas else 0 end) przestoje_powyzej_1_min
,count(elementy) WyprodukowaneElementy
,sum(case when elementy=1 then 1 else 0 end) iloscbledow
from
d
group by
DATEPART(YEAR,DATEADD(YEAR,CASE WHEN (DATEPART(HH,LUD)<6 and DATEPART(dd,LUD)=1 and datepart(mm,lud)=1) THEN -1 ELSE 0 END,lud)),
DATEPART(MONTH,DATEADD(MONTH,CASE WHEN (DATEPART(HH,LUD)<6 and DATEPART(dd,LUD)=1) THEN -1 ELSE 0 END,lud)),
DATEPART(DAY,DATEADD(DAY,CASE WHEN DATEPART(HH,LUD)<6 THEN -1 ELSE 0 END,lud)),
datepart(hour, dateadd(hour,-6,LUD))/8+1
http://sqlfiddle.com/#!18/da023/1
Jeszcze raz dzięki za pomoc!