SQLTeam.com | Weblogs | Forums

Filtro risultati query per intervallo di tempo

Buongiorno a tutti volevo sapere se potete aiutarmi con il filtro per i dati in uscita da una query, praticamente, dalla query, carico un report e tutti ricorda hanno un data (riportata fino al secondo di registrazione del record), un id e un nome operazione.

Il problema è che dando un parametro in entrata di X secondi, si dovrebbero prendere tutti i record di quell'intervallo di secondi ed estrarne solo il più vecchio, come posso impostare il filtro?
Nel caso un between fra le date fosse sufficiente, come lo imposto per far estrarre solo il record più vecchio di un dato intervallo di secondi?

Grazie a tutti per l'aiuto e buona giornata

Benvenuto! Fornisci un campione dei tuoi dati, nel seguente formato(google translate)

create table #formaggio(id int, nome nvarchar(50), secundo int)

insert into #formaggio
select 1, 'baggio ha mancato il rigore', 345

La mia tabella ha il seguente formato

ID_EVENTO TIMESTAMP CODICE_OPERAZIONE

A 11.04.2020 12:02:32 DoConto
B 11.04.2020 12:03:03 DoConto
C 11.04.2020 12:03:05 DoConto
D 11.04.2020 12:09:15 DoConto
E 11.04.2020 12:14:54 DoConto
F 11.04.2020 12:14:54 DoConto
G 11.04.2020 12:14:56 DoConto
H 11.04.2020 12:14:57 DoConto
I 11.04.2020 12:14:58 DoConto
L 11.04.2020 12:15:00 DoConto
M 11.04.2020 12:15:01 DoConto
N 11.04.2020 12:15:32 DoConto
O 11.04.2020 12:16:03 DoConto

Se si stabilisce un intervallo di (ad esempio) 5 secondi, di quel intervallo dovrà essere estratto solo il record più vecchio

cosi per favore? intervalli tra quali valori?

utilizzando i dati di esempio forniti e con un intervallo di 5 secondi quale dovrebbe essere il risultato?

declare @mushroom table(ID_EVENTO char(1), zizo datetime, CODICE_OPERAZIONE nvarchar(50))
 
 insert into @mushroom

select 'A', '11.04.2020 12:02:32', 'DoConto' union
select 'B', '11.04.2020 12:03:03', 'DoConto' union
select 'C', '11.04.2020 12:03:05', 'DoConto' union
select 'D', '11.04.2020 12:09:15', 'DoConto' union
select 'E', '11.04.2020 12:14:54', 'DoConto' union
select 'F', '11.04.2020 12:14:54', 'DoConto' union
select 'G', '11.04.2020 12:14:56', 'DoConto' union
select 'H', '11.04.2020 12:14:57', 'DoConto' union
select 'I', '11.04.2020 12:14:58', 'DoConto' union
select 'L', '11.04.2020 12:15:00', 'DoConto' union
select 'M', '11.04.2020 12:15:01', 'DoConto' union
select 'N', '11.04.2020 12:15:32', 'DoConto' union
select 'O', '11.04.2020 12:16:03', 'DoConto' 



select * from @mushroom

Tra tutte quelle eseguite, di quelle dell'intervallo di 5 secondi considerato (ad esempio dalle ore 12:14:55 alle 12:15:00), sia riportata solo il record più vecchio.
Ovviamente in input, non posso inserire i vari orari come where condition

declare @filter int = 5;

;with src
as
(
	select ID_EVENTO,
		   CODICE_OPERAZIONE,
		   entryDate as _Current,
		   LEAD(entryDate, 1,0) OVER (ORDER BY entryDate) AS Next ,
		   --LAG(entryDate, 1,0) OVER (ORDER BY entryDate) AS Previous ,
		   case 
			  when LEAD(entryDate, 1,0) OVER (ORDER BY entryDate) = '1900-01-01 00:00:00.000' then null
			  else datediff(second, entryDate, LEAD(entryDate, 1,0) OVER (ORDER BY entryDate))
		   end as _seconds	   
	  from @mushroom
)
select * 
  from src
  where _seconds = @filter