OVH Cloud OVH Cloud

Requete SQL : extraction de données historisation

14 réponses
Avatar
Synopsis
Bonjour,

Il existe dans mon infocentre une table d'historisation de structure
simialaire à celle ci-dessous.

DEBUT FIN REGION VILLE
01/01/2000 30/04/2002 IDF Paris
01/05/2002 14/02/2003 IDF Montreuil
15/02/2003 21/10/2004 IDF Neuilly
22/10/2004 15/01/2005 BRE Rennes
16/01/2005 18/06/2006 BRE Brest
19/06/2006 30/09/2007 NRD Lille
01/10/2007 30/09/2007 IDF Lille
01/10/2007 31/12/2999 IDF Arcueil

Je cherche une méthode, une requête simple qui m'extrait l''historisation au
niveau région.

DEBUT FIN REGION
01/01/2000 21/10/2004 IDF
22/10/2004 18/06/2006 BRE
19/06/2006 30/09/2007 NRD
01/10/2007 31/12/2999 IDF

La méthode par Group By, min, max ne fonctionne pas, car la région IDF
apparaît deux fois.

En utilisant les fonctions analytiques Over Partition ?

La méthode doit-être simple si possible ; j'utlise B.O. comme outil
d'intérrogation.
Je souhaiterai implémenter la méthode dans le designer.

Cordialement,


---------------------------------------------------------------------------------------------------
Script SQL :

if exists(select * from INFORMATION_SCHEMA.TABLES where TABLE_NAME =
'LOCALISATION')
DROP TABLE LOCALISATION
GO

CREATE TABLE LOCALISATION
(
DATE_DEBUT DATE
, DATE_FIN DATE
, REGION NVARCHAR(3)
, VILLE NVARCHAR(20)
)
GO
SET NOCOUNT ON
INSERT INTO LOCALISATION VALUES( CONVERT(DATETIME, '20000101', 112) ,
CONVERT(DATETIME, '20020430', 112), 'IDF', 'Paris')
INSERT INTO LOCALISATION VALUES( CONVERT(DATETIME, '20020430', 112) + 1 ,
CONVERT(DATETIME, '20030214', 112), 'IDF', 'Montreuil')
INSERT INTO LOCALISATION VALUES( CONVERT(DATETIME, '20030214', 112) + 1 ,
CONVERT(DATETIME, '20041021', 112), 'IDF', 'Neuilly')
INSERT INTO LOCALISATION VALUES( CONVERT(DATETIME, '20041021', 112) + 1 ,
CONVERT(DATETIME, '20050115', 112), 'BRE', 'Rennes')
INSERT INTO LOCALISATION VALUES( CONVERT(DATETIME, '20050115', 112) + 1 ,
CONVERT(DATETIME, '20060618', 112), 'BRE', 'Brest')
INSERT INTO LOCALISATION VALUES( CONVERT(DATETIME, '20060618', 112) + 1 ,
CONVERT(DATETIME, '20070930', 112), 'NRD', 'Lille')
INSERT INTO LOCALISATION VALUES( CONVERT(DATETIME, '20070930', 112) + 1 ,
CONVERT(DATETIME, '20070930', 112), 'IDF', 'Lille')
INSERT INTO LOCALISATION VALUES( CONVERT(DATETIME, '20070930', 112) + 1 ,
CONVERT(DATETIME, '29991231', 112), 'IDF', 'Arcueil')

4 réponses

1 2
Avatar
Med, Bruno, Pascale - Solid Quality Fran
Bonjour,
je pense avoir fait le tour du pb avec Med et Bruno.
et donc voici:

WITH cte as
(
SELECT *, row_number () over (order by region, datdeb ) as d
FROM brtt as t
Where
not exists
(select * from brtt tt
where tt.datdeb = t.datfin +1 and tt.region = t.region)

union all

SELECT *, row_number () over (order by region, datfin ) as d
FROM brtt as t
Where
not exists
(select * from brtt tt
where t.datdeb-1 = tt.datfin and tt.region = t.region)
)
select min (t.datdeb), max (t.datfin), t.region
from cte as t
group by t.d, t.region

Cordialement
Med, Bruno, Pascale
Solid Quality France

"Michel__D" wrote:

Bonjour,

Synopsis a écrit :
> Ce n'est pas un extrait de ma base de données.
> J'ai monté l'exemple en rédigeant le mail.
>
> Pour l'exemple, on remplace
> 01/10/2007 30/09/2007 IDF Lille
> Par
> 01/10/2007 30/09/2007 IDF Bondy

Le problème n'est pas sur la ville, mais sur les dates

>>>
>>> DEBUT FIN REGION VILLE
>>> 01/01/2000 30/04/2002 IDF Paris
>>> 01/05/2002 14/02/2003 IDF Montreuil
>>> 15/02/2003 21/10/2004 IDF Neuilly
>>> 22/10/2004 15/01/2005 BRE Rennes
>>> 16/01/2005 18/06/2006 BRE Brest
>>> 19/06/2006 30/09/2007 NRD Lille
>>
>> Ligne fausse : date début > date fin.
>>
>>> 01/10/2007 30/09/2007 IDF Lille



Avatar
Michel__D
Bonjour,

Med a écrit :
Bonjour,
je pense avoir fait le tour du pb avec Med et Bruno.




Peut-être, mais cela reste incohérent et donc ton truc ne marchera plus lorsque :
Abs ( datfin - datdeb ) <> 1


et donc voici:

WITH cte as
(
SELECT *, row_number () over (order by region, datdeb ) as d
FROM brtt as t
Where
not exists
(select * from brtt tt
where tt.datdeb = t.datfin +1 and tt.region = t.region)

union all

SELECT *, row_number () over (order by region, datfin ) as d
FROM brtt as t
Where
not exists
(select * from brtt tt
where t.datdeb-1 = tt.datfin and tt.region = t.region)
)
select min (t.datdeb), max (t.datfin), t.region
from cte as t
group by t.d, t.region

Cordialement
Med, Bruno, Pascale
Solid Quality France

"Michel__D" wrote:

Bonjour,

Synopsis a écrit :
Ce n'est pas un extrait de ma base de données.
J'ai monté l'exemple en rédigeant le mail.

Pour l'exemple, on remplace
01/10/2007 30/09/2007 IDF Lille
Par
01/10/2007 30/09/2007 IDF Bondy


Le problème n'est pas sur la ville, mais sur les dates

DEBUT FIN REGION VILLE
01/01/2000 30/04/2002 IDF Paris
01/05/2002 14/02/2003 IDF Montreuil
15/02/2003 21/10/2004 IDF Neuilly
22/10/2004 15/01/2005 BRE Rennes
16/01/2005 18/06/2006 BRE Brest
19/06/2006 30/09/2007 NRD Lille






>>
Ligne fausse : date début > date fin.

01/10/2007 30/09/2007 IDF Lille










Avatar
Synopsis
Merci beaucoup.

Après quelques corrections dans mes données, j'ai testé votre solution.
Elle fonctionne parfaitement.

Elle prend en compte aussi les ruptures de périodes.

Cordialement,



"Med, Bruno, Pascale - Solid Quality Fran" <Med, Bruno, Pascale - Solid
Quality a écrit dans le message de news:

Bonjour,
je pense avoir fait le tour du pb avec Med et Bruno.
et donc voici:

WITH cte as
(
SELECT *, row_number () over (order by region, datdeb ) as d
FROM brtt as t
Where
not exists
(select * from brtt tt
where tt.datdeb = t.datfin +1 and tt.region = t.region)

union all

SELECT *, row_number () over (order by region, datfin ) as d
FROM brtt as t
Where
not exists
(select * from brtt tt
where t.datdeb-1 = tt.datfin and tt.region = t.region)
)
select min (t.datdeb), max (t.datfin), t.region
from cte as t
group by t.d, t.region

Cordialement
Med, Bruno, Pascale
Solid Quality France

"Michel__D" wrote:

Bonjour,

Synopsis a écrit :
> Ce n'est pas un extrait de ma base de données.
> J'ai monté l'exemple en rédigeant le mail.
>
> Pour l'exemple, on remplace
> 01/10/2007 30/09/2007 IDF Lille
> Par
> 01/10/2007 30/09/2007 IDF Bondy

Le problème n'est pas sur la ville, mais sur les dates

>>>
>>> DEBUT FIN REGION VILLE
>>> 01/01/2000 30/04/2002 IDF Paris
>>> 01/05/2002 14/02/2003 IDF Montreuil
>>> 15/02/2003 21/10/2004 IDF Neuilly
>>> 22/10/2004 15/01/2005 BRE Rennes
>>> 16/01/2005 18/06/2006 BRE Brest
>>> 19/06/2006 30/09/2007 NRD Lille
>>
>> Ligne fausse : date début > date fin.
>>
>>> 01/10/2007 30/09/2007 IDF Lille






Avatar
Synopsis
J'ai déposé le script SQL et la solution : http://cjoint.com/?eBprLQPuDd


"Synopsis" a écrit dans le message de news:
49f39d39$0$14423$
Merci beaucoup.

Après quelques corrections dans mes données, j'ai testé votre solution.
Elle fonctionne parfaitement.

Elle prend en compte aussi les ruptures de périodes.

Cordialement,



"Med, Bruno, Pascale - Solid Quality Fran" <Med, Bruno, Pascale - Solid
Quality a écrit dans le message de news:

Bonjour,
je pense avoir fait le tour du pb avec Med et Bruno.
et donc voici:

WITH cte as
(
SELECT *, row_number () over (order by region, datdeb ) as d
FROM brtt as t
Where
not exists
(select * from brtt tt
where tt.datdeb = t.datfin +1 and tt.region = t.region)

union all

SELECT *, row_number () over (order by region, datfin ) as d
FROM brtt as t
Where
not exists
(select * from brtt tt
where t.datdeb-1 = tt.datfin and tt.region = t.region)
)
select min (t.datdeb), max (t.datfin), t.region
from cte as t
group by t.d, t.region

Cordialement
Med, Bruno, Pascale
Solid Quality France

"Michel__D" wrote:

Bonjour,

Synopsis a écrit :
> Ce n'est pas un extrait de ma base de données.
> J'ai monté l'exemple en rédigeant le mail.
>
> Pour l'exemple, on remplace
> 01/10/2007 30/09/2007 IDF Lille
> Par
> 01/10/2007 30/09/2007 IDF Bondy

Le problème n'est pas sur la ville, mais sur les dates

>>>
>>> DEBUT FIN REGION VILLE
>>> 01/01/2000 30/04/2002 IDF Paris
>>> 01/05/2002 14/02/2003 IDF Montreuil
>>> 15/02/2003 21/10/2004 IDF Neuilly
>>> 22/10/2004 15/01/2005 BRE Rennes
>>> 16/01/2005 18/06/2006 BRE Brest
>>> 19/06/2006 30/09/2007 NRD Lille
>>
>> Ligne fausse : date début > date fin.
>>
>>> 01/10/2007 30/09/2007 IDF Lille











1 2