salve,
non so se ho ben compreso... data una popolazione tipo
2017-07-12 05:59 | x (NO)
2017-07-12 08:36 | 1
2017-07-12 10:02 | 5
2017-07-12 16:02 | x (NO)
vuoi un'estrazione da 2017-07-12 06:00 a 2017-07-12 16:00 compresi e, nel caso 2017-07-12 06:00 NON sia presente, vuoi comunque la proiezione di {2017-07-12 06:00 | NULL}, e lo stesso per il termine del time frame
in questo caso, in Transact-SQL, personalmente farei una UNION di tutti i valori presenti nel time frame + 2017-07-12 06:00 | NULL + 2017-07-12 16:00 | NULL
di seguito ordinerei il risultato per il valore secondo la partizione temporale... in SQL Server NULL viene sempre ordinato come valore "piu' piccolo", quindi "giocherei" con la valorizzazione dell'attributo temporale per rendere il valore ordinalmente fuori range... in questo modo avrei per ogni time frame una valorizzazione reale con ordinale 1 (e valorizzazione fittizia aggiunta con ordinale uguale alla cardinalita' della partizione) oppure solo il valore fittizio in sua assenza, con ordinale sempre uguale a 1...
fatto questo, potrei filtrare tale risultato per le sole righe con ordinale partizionato = 1
trivialmente,
SET NOCOUNT ON;
USE tempdb;
GO
CREATE TABLE dbo.data (
dt datetime,
value int
);
GO
--INSERT INTO dbo.data
-- VALUES ( '2018-07-12 06:00', 1);
INSERT INTO dbo.data
VALUES ( '2018-07-12 06:36', 1);
INSERT INTO dbo.data
VALUES ( '2018-07-12 08:36', 1);
GO
DECLARE @twin1 datetime = '2018-07-12 06:00';
DECLARE @twin2 datetime = '2018-07-12 16:00';
WITH cteBase AS (
SELECT d.dt, d.value
FROM dbo.data d
WHERE d.dt BETWEEN @twin1 AND @twin2
UNION
SELECT @twin1 AS [dt], NULL AS [value]
UNION
SELECT @twin2 AS [dt], NULL AS [value]
),
cteFil AS (
SELECT c.dt, c.value, ROW_NUMBER() OVER (PARTITION BY c.dt ORDER BY CASE WHEN c.value IS NULL THEN DATEADD(S, 1, @twin2) ELSE c.dt END ) AS [rn]
FROM cteBase c
)
SELECT *
FROM cteFil c
WHERE c.rn = 1
ORDER BY c.dt
GO
DROP TABLE dbo.data;
--<-------
dt value rn
----------------------- ----------- ---
2018-07-12 06:00:00.000 NULL 1
2018-07-12 06:36:00.000 1 1
2018-07-12 08:36:00.000 1 1
2018-07-12 16:00:00.000 NULL 1
in MySQL, non saprei come tradurlo :D
mi sorge poi il dubbio sulla possibilita' di risultati multipli per la stessa frazione temporale... ci sono piu' valorizzazioni??
salutoni
Modificato da Andrea Montanari il 12 luglio 2018 17.35 -