Selezionare righe ogni x minuti

di il
4 risposte

Selezionare righe ogni x minuti

Salve,
vorrei creare una querry che mi selezioni le righe da una tabella in base ad un valore di tempo impostato.
Supponendo di avere una tabella con un valore "value" per ogni minuto.
Se l'utente sceglie 10, la querty deve tirare fuori un valore "value" ogni 10 minuti.

es:
timestamp value
11.10 5
11.11 5
11.12 6
11.13 7
11.14 8
11.15 10
11.16 11
11.17 13
11.18 15

e l'operatore sceglie di voler vedere un valore ogni 2 minuti, il risultato dev'essere:

timestamp value
11.10 5
11.12 6
11.14 8
11.16 11
11.18 15

Secondo voi è fattibile?

4 Risposte

  • Re: Selezionare righe ogni x minuti

    Banale condizione del tipo

    minuto(timestamp) modulo N == 0

    dove N e' l'intervallo in minuti che ti interessa (nell'esempio proposto, N=2)

    Resto di una divisione, robbbba da elementari!
  • Re: Selezionare righe ogni x minuti

    È vero!

    pero non funziona.. funziona solo se hai una registrazione della tag al minuto. E quindi hai a disposizione una riga per ogni minuto.

    Ma se hai un set di dati come ti ho scritto nell'esempio, e provi a fare la query come dici tu, non ottieni il risultato desiderato.
    IL risultato giusto sarebbe avere la prima riga e poi una riga ogni x minuti. Che non corrisponde ad avere l'orario mod x = 0
  • Re: Selezionare righe ogni x minuti

    OVVIAMENTE

    x%10 == 0 SE vuoi seleziona 0, 10, 20, 30, ..
    x%10 == 1 SE vuoi selezionare 1, 11, 21, 31, ...
    x%10 == 9 SE viou selezionare 9, 19, 29, 39, ...

    SE voi pescare il timestamp piu' vicino a 10, 20, ecc, NON E' una query che puoi esprimere mediante SQL

    Devi farlo da codice, lato client o storedprocedure .
  • Re: Selezionare righe ogni x minuti

    Salve,
    c'e' una soluzione matematica interessante su https://stackoverflow.com/questions/5002661/how-to-group-time-by-hour-or-by-10-minutes...

    brutalmente, visto la tabella {Id (identity), Data}, con popolazione
    
    	VALUES ( '2020-01-01 10:00:01' ), ( '2020-01-01 10:01:15' ), ( '2020-01-01 10:02:30' ), ( '2020-01-01 10:03:45' ), ( '2020-01-01 10:04:00' )
    		, ( '2020-01-01 10:05:01' ), ( '2020-01-01 10:06:15' ), ( '2020-01-01 10:07:30' ), ( '2020-01-01 10:08:45' ), ( '2020-01-01 10:09:00' )
    		, ( '2020-01-01 10:55:01' ), ( '2020-01-01 10:56:15' ), ( '2020-01-01 10:57:30' ), ( '2020-01-01 10:58:45' ), ( '2020-01-01 10:59:00' )
    		, ( '2020-01-01 11:01:01' ), ( '2020-01-01 10:03:15' ), ( '2020-01-01 11:05:30' ), ( '2020-01-01 11:08:45' ), ( '2020-01-01 11:09:00' )
    
    
    (non metto codice di insert per non causare problemi di filtro sul forum)

    con filtri passati via codice per la data e il timeFrame, se ti ho ben capito potremmo fare qualche cosa simile a
    
    DECLARE @data datetime = '2020-01-01';
    DECLARE @frame int = 3; -- 3 minuti
    
    SELECT DATEADD(MINUTE, DATEDIFF(MINUTE, '2000', [Data]) / @frame * @frame, '2000') AS [date_truncated]
    	, COUNT(*) AS [records_in_interval]
    	, MIN([Data]) [TimeStampFrame]
    	, MIN(Id) [IdTimeStampFrame]
    	FROM dbo.t
    	WHERE DATEADD(dd, DATEDIFF(dd, 0, Data), 0) = @data
    	GROUP BY DATEADD(MINUTE, DATEDIFF(MINUTE, '2000', [Data]) / @frame * @frame, '2000')
    	ORDER BY [date_truncated];
    
    WITH cte AS (
    SELECT DATEADD(MINUTE, DATEDIFF(MINUTE, '2000', [Data]) / @frame * @frame, '2000') AS [date_truncated]
    	, COUNT(*) AS [records_in_interval]
    	, MIN([Data]) [TimeStampFrame]
    	, MIN(Id) [IdTimeStampFrame]
    	FROM dbo.t
    	WHERE DATEADD(dd, DATEDIFF(dd, 0, Data), 0) = @data
    	GROUP BY DATEADD(MINUTE, DATEDIFF(MINUTE, '2000', [Data]) / @frame * @frame, '2000')
    	)
    	SELECT cte.IdTimeStampFrame, cte.TimeStampFrame
    		FROM cte
    		ORDER BY cte.IdTimeStampFrame;
    
    -------------
    -- primo set omissis
    
    -- set finale di presentazione
    IdTimeStampFrame TimeStampFrame
    ---------------- -----------------------
    1                2020-01-01 10:00:01.000
    4                2020-01-01 10:03:15.000
    7                2020-01-01 10:06:15.000
    10               2020-01-01 10:09:00.000
    11               2020-01-01 10:55:01.000
    13               2020-01-01 10:57:30.000
    16               2020-01-01 11:01:01.000
    18               2020-01-01 11:05:30.000
    19               2020-01-01 11:08:45.000
    20               2020-01-01 11:09:00.000
    
    
    
    salutoni romagnoli
    --
    Andrea
Devi accedere o registrarti per scrivere nel forum
4 risposte