OVH Cloud OVH Cloud

Comment faire cette requette ?

9 réponses
Avatar
Laurent HOUTANT
Bonjour,
je n'arrive pas a ecrire la requete suivante:
dans une table T_POSITION_POS
POS_ID
POS_VEHICULE
POS_DATE
POS_LATITUDE
POS_LONGITUDE

je souhaite obtenir la chose suivante:

POS_VEHICULE, POS_DATE,POS_LATITUDE,POS_LONGITUDE
ou chaque ligne correspond a la derniere position de chaque véhicule.
je pense bien a GROUP BY (POS_VEHICULE) et MAX(POS_DATE) mais comment puis
je afficher POS_LATITUDE et POS_LONGITUDE correspondant à GROUP BY
(POS_VEHICULE) et MAX(POS_DATE).
Merci pour votre aide

9 réponses

Avatar
Steve Kass
Si la colonne POS_ID est la clé:

select
POS_VEHICULE, POS_DATE, POS_LATITUDE, POS_LONGITUDE
from T as T1
where POS_ID = (
select top 1 POS_ID
from T as T2
where T2.VEHICULE = T1.VEHICULE
order by POS_DATE desc
)

ou

select
POS_VEHICULE, POS_DATE, POS_LATITUDE, POS_LONGITUDE
from T as T1
where POS_DATE = (
select max(POS_DATE)
from T as T2
where T2.VEHICULE = T1.VEHICULE
)

ou

select
POS_VEHICULE, POS_DATE, POS_LATITUDE, POS_LONGITUDE
from T
where not exists (
select *
from T as T2
where T2.VEHICULE = T1.VEHICULE
and T2.POS_DATE > T1.POS_DATE
)

Steve Kass
Drew University




Laurent HOUTANT wrote:

Bonjour,
je n'arrive pas a ecrire la requete suivante:
dans une table T_POSITION_POS
POS_ID
POS_VEHICULE
POS_DATE
POS_LATITUDE
POS_LONGITUDE

je souhaite obtenir la chose suivante:

POS_VEHICULE, POS_DATE,POS_LATITUDE,POS_LONGITUDE
ou chaque ligne correspond a la derniere position de chaque véhicule.
je pense bien a GROUP BY (POS_VEHICULE) et MAX(POS_DATE) mais comment puis
je afficher POS_LATITUDE et POS_LONGITUDE correspondant à GROUP BY
(POS_VEHICULE) et MAX(POS_DATE).
Merci pour votre aide






Avatar
Laurent HOUTANT
Merci, ton aide va m'etre precieuse.
Laurent
"Steve Kass" a écrit dans le message de news:
uiOomn3$
Si la colonne POS_ID est la clé:

select
POS_VEHICULE, POS_DATE, POS_LATITUDE, POS_LONGITUDE
from T as T1
where POS_ID = (
select top 1 POS_ID
from T as T2
where T2.VEHICULE = T1.VEHICULE
order by POS_DATE desc
)

ou

select
POS_VEHICULE, POS_DATE, POS_LATITUDE, POS_LONGITUDE
from T as T1
where POS_DATE = (
select max(POS_DATE)
from T as T2
where T2.VEHICULE = T1.VEHICULE
)

ou

select
POS_VEHICULE, POS_DATE, POS_LATITUDE, POS_LONGITUDE
from T
where not exists (
select *
from T as T2
where T2.VEHICULE = T1.VEHICULE
and T2.POS_DATE > T1.POS_DATE
)

Steve Kass
Drew University




Laurent HOUTANT wrote:

Bonjour,
je n'arrive pas a ecrire la requete suivante:
dans une table T_POSITION_POS
POS_ID
POS_VEHICULE
POS_DATE
POS_LATITUDE
POS_LONGITUDE

je souhaite obtenir la chose suivante:

POS_VEHICULE, POS_DATE,POS_LATITUDE,POS_LONGITUDE
ou chaque ligne correspond a la derniere position de chaque véhicule.
je pense bien a GROUP BY (POS_VEHICULE) et MAX(POS_DATE) mais comment puis
je afficher POS_LATITUDE et POS_LONGITUDE correspondant à GROUP BY
(POS_VEHICULE) et MAX(POS_DATE).
Merci pour votre aide






Avatar
Med Bouchenafa
ou encore

select T1.POS_VEHICULE,
T1.POS_LATITUDE,
T1.POS_LONGITUDE,
T1.POS_DATE
from T_POSITION_POS T1 inner join (select POS_VEHICULE,
MAX_DATE=max(POS_DATE) from T_POSITION_POS group by POS_VEHICULE)T2 on
T1.POS_DATE = T2.MAX_DATE



and T1.POS_VEHICULE= T2.POS_VEHICULE
La formulation 2 de "Steve Kass" reste la plus simple à appréhender.


Bien cordialement
Med Bouchenafa


a écrit dans le message de news:
uiOomn3$
Si la colonne POS_ID est la clé:

select
POS_VEHICULE, POS_DATE, POS_LATITUDE, POS_LONGITUDE
from T as T1
where POS_ID = (
select top 1 POS_ID
from T as T2
where T2.VEHICULE = T1.VEHICULE
order by POS_DATE desc
)

ou

select
POS_VEHICULE, POS_DATE, POS_LATITUDE, POS_LONGITUDE
from T as T1
where POS_DATE = (
select max(POS_DATE)
from T as T2
where T2.VEHICULE = T1.VEHICULE
)

ou

select
POS_VEHICULE, POS_DATE, POS_LATITUDE, POS_LONGITUDE
from T
where not exists (
select *
from T as T2
where T2.VEHICULE = T1.VEHICULE
and T2.POS_DATE > T1.POS_DATE
)

Steve Kass
Drew University




Laurent HOUTANT wrote:

Bonjour,
je n'arrive pas a ecrire la requete suivante:
dans une table T_POSITION_POS
POS_ID
POS_VEHICULE
POS_DATE
POS_LATITUDE
POS_LONGITUDE

je souhaite obtenir la chose suivante:

POS_VEHICULE, POS_DATE,POS_LATITUDE,POS_LONGITUDE
ou chaque ligne correspond a la derniere position de chaque véhicule.
je pense bien a GROUP BY (POS_VEHICULE) et MAX(POS_DATE) mais comment puis
je afficher POS_LATITUDE et POS_LONGITUDE correspondant à GROUP BY
(POS_VEHICULE) et MAX(POS_DATE).
Merci pour votre aide






Avatar
Synopsis
SELECT T1.*
FROM T as T1
JOIN (
SELECT POS_VEHICULE, MAX(POS_DATE) POS_DATE_MAX
FROM T
GROUP BY POS_VEHICULE
) T2 ON (
T1.POS_VEHICULE = T2.POS_VEHICULE
AND T1.POS_DATE = T2.POS_DATE_MAX
)
ORDER BY T1.POS_VEHICULE


POS_VEHICULE, POS_DATE, POS_LATITUDE, POS_LONGITUDE
from T as T1
where POS_ID = (
select top 1 POS_ID
from T as T2
where T2.VEHICULE = T1.VEHICULE
order by POS_DATE desc
)





"Steve Kass" a écrit dans le message de
news:uiOomn3$
Si la colonne POS_ID est la clé:

select
POS_VEHICULE, POS_DATE, POS_LATITUDE, POS_LONGITUDE
from T as T1
where POS_ID = (
select top 1 POS_ID
from T as T2
where T2.VEHICULE = T1.VEHICULE
order by POS_DATE desc
)

ou

select
POS_VEHICULE, POS_DATE, POS_LATITUDE, POS_LONGITUDE
from T as T1
where POS_DATE = (
select max(POS_DATE)
from T as T2
where T2.VEHICULE = T1.VEHICULE
)

ou

select
POS_VEHICULE, POS_DATE, POS_LATITUDE, POS_LONGITUDE
from T
where not exists (
select *
from T as T2
where T2.VEHICULE = T1.VEHICULE
and T2.POS_DATE > T1.POS_DATE
)

Steve Kass
Drew University




Laurent HOUTANT wrote:

>Bonjour,
>je n'arrive pas a ecrire la requete suivante:
>dans une table T_POSITION_POS
>POS_ID
>POS_VEHICULE
>POS_DATE
>POS_LATITUDE
>POS_LONGITUDE
>
>je souhaite obtenir la chose suivante:
>
>POS_VEHICULE, POS_DATE,POS_LATITUDE,POS_LONGITUDE
>ou chaque ligne correspond a la derniere position de chaque véhicule.
>je pense bien a GROUP BY (POS_VEHICULE) et MAX(POS_DATE) mais comment


puis
>je afficher POS_LATITUDE et POS_LONGITUDE correspondant à GROUP BY
>(POS_VEHICULE) et MAX(POS_DATE).
>Merci pour votre aide
>
>
>
>


Avatar
Fred BROUARD
plus élégant, sans sous requête :

select POS_VEHICULE, POS_DATE, POS_LATITUDE, POS_LONGITUDE
from T as T1
CROSS JOIN T as T2
where T1.POS_DATE = max(T2.POS_DATE)
and T1.VEHICULE = T2.VEHICULE
GROUP BY T2.VEHICULE


A +

--
Frédéric BROUARD, MVP SQL Server. Expert SQL / spécialiste Delphi, web
Livre SQL - col. Référence : http://sqlpro.developpez.com/bookSQL.html
Le site du SQL, pour débutants et pros : http://sqlpro.developpez.com
************************ www.datasapiens.com *************************


Med Bouchenafa a écrit:
ou encore

select T1.POS_VEHICULE,
T1.POS_LATITUDE,
T1.POS_LONGITUDE,
T1.POS_DATE
from T_POSITION_POS T1 inner join (select POS_VEHICULE,
MAX_DATE=max(POS_DATE) from T_POSITION_POS group by POS_VEHICULE)T2 on
T1.POS_DATE = T2.MAX_DATE



and T1.POS_VEHICULE= T2.POS_VEHICULE
La formulation 2 de "Steve Kass" reste la plus simple à appréhender.


Bien cordialement
Med Bouchenafa


a écrit dans le message de news:
uiOomn3$

Si la colonne POS_ID est la clé:

select
POS_VEHICULE, POS_DATE, POS_LATITUDE, POS_LONGITUDE
from T as T1
where POS_ID = (
select top 1 POS_ID
from T as T2
where T2.VEHICULE = T1.VEHICULE
order by POS_DATE desc
)

ou

select
POS_VEHICULE, POS_DATE, POS_LATITUDE, POS_LONGITUDE
from T as T1
where POS_DATE = (
select max(POS_DATE)
from T as T2
where T2.VEHICULE = T1.VEHICULE
)

ou

select
POS_VEHICULE, POS_DATE, POS_LATITUDE, POS_LONGITUDE
from T
where not exists (
select *
from T as T2
where T2.VEHICULE = T1.VEHICULE
and T2.POS_DATE > T1.POS_DATE
)

Steve Kass
Drew University




Laurent HOUTANT wrote:


Bonjour,
je n'arrive pas a ecrire la requete suivante:
dans une table T_POSITION_POS
POS_ID
POS_VEHICULE
POS_DATE
POS_LATITUDE
POS_LONGITUDE

je souhaite obtenir la chose suivante:

POS_VEHICULE, POS_DATE,POS_LATITUDE,POS_LONGITUDE
ou chaque ligne correspond a la derniere position de chaque véhicule.
je pense bien a GROUP BY (POS_VEHICULE) et MAX(POS_DATE) mais comment puis
je afficher POS_LATITUDE et POS_LONGITUDE correspondant à GROUP BY
(POS_VEHICULE) et MAX(POS_DATE).
Merci pour votre aide











Avatar
Fred BROUARD
plus élégant, sans sous requête :

select POS_VEHICULE, POS_DATE, POS_LATITUDE, POS_LONGITUDE
from T as T1
CROSS JOIN T as T2
where T1.POS_DATE = max(T2.POS_DATE)
and T1.VEHICULE = T2.VEHICULE
GROUP BY T2.VEHICULE


A +

--
Frédéric BROUARD, MVP SQL Server. Expert SQL / spécialiste Delphi, web
Livre SQL - col. Référence : http://sqlpro.developpez.com/bookSQL.html
Le site du SQL, pour débutants et pros : http://sqlpro.developpez.com
************************ www.datasapiens.com *************************


Med Bouchenafa a écrit:
ou encore

select T1.POS_VEHICULE,
T1.POS_LATITUDE,
T1.POS_LONGITUDE,
T1.POS_DATE
from T_POSITION_POS T1 inner join (select POS_VEHICULE,
MAX_DATE=max(POS_DATE) from T_POSITION_POS group by POS_VEHICULE)T2 on
T1.POS_DATE = T2.MAX_DATE



and T1.POS_VEHICULE= T2.POS_VEHICULE
La formulation 2 de "Steve Kass" reste la plus simple à appréhender.


Bien cordialement
Med Bouchenafa


a écrit dans le message de news:
uiOomn3$

Si la colonne POS_ID est la clé:

select
POS_VEHICULE, POS_DATE, POS_LATITUDE, POS_LONGITUDE
from T as T1
where POS_ID = (
select top 1 POS_ID
from T as T2
where T2.VEHICULE = T1.VEHICULE
order by POS_DATE desc
)

ou

select
POS_VEHICULE, POS_DATE, POS_LATITUDE, POS_LONGITUDE
from T as T1
where POS_DATE = (
select max(POS_DATE)
from T as T2
where T2.VEHICULE = T1.VEHICULE
)

ou

select
POS_VEHICULE, POS_DATE, POS_LATITUDE, POS_LONGITUDE
from T
where not exists (
select *
from T as T2
where T2.VEHICULE = T1.VEHICULE
and T2.POS_DATE > T1.POS_DATE
)

Steve Kass
Drew University




Laurent HOUTANT wrote:


Bonjour,
je n'arrive pas a ecrire la requete suivante:
dans une table T_POSITION_POS
POS_ID
POS_VEHICULE
POS_DATE
POS_LATITUDE
POS_LONGITUDE

je souhaite obtenir la chose suivante:

POS_VEHICULE, POS_DATE,POS_LATITUDE,POS_LONGITUDE
ou chaque ligne correspond a la derniere position de chaque véhicule.
je pense bien a GROUP BY (POS_VEHICULE) et MAX(POS_DATE) mais comment puis
je afficher POS_LATITUDE et POS_LONGITUDE correspondant à GROUP BY
(POS_VEHICULE) et MAX(POS_DATE).
Merci pour votre aide











Avatar
Med Bouchenafa
C'est peut-être élègant et même intuitif mais faux
SQL n'accepte pas de fonctions d'agrégation (MAX ici) dans la clause WHERE

--
Bien cordialement
Med Bouchenafa

"Fred BROUARD" a écrit dans le message de news:

plus élégant, sans sous requête :

select POS_VEHICULE, POS_DATE, POS_LATITUDE, POS_LONGITUDE
from T as T1
CROSS JOIN T as T2
where T1.POS_DATE = max(T2.POS_DATE)
and T1.VEHICULE = T2.VEHICULE
GROUP BY T2.VEHICULE


A +

--
Frédéric BROUARD, MVP SQL Server. Expert SQL / spécialiste Delphi, web
Livre SQL - col. Référence : http://sqlpro.developpez.com/bookSQL.html
Le site du SQL, pour débutants et pros : http://sqlpro.developpez.com
************************ www.datasapiens.com *************************


Med Bouchenafa a écrit:
ou encore

select T1.POS_VEHICULE,
T1.POS_LATITUDE,
T1.POS_LONGITUDE,
T1.POS_DATE
from T_POSITION_POS T1 inner join (select POS_VEHICULE,
MAX_DATE=max(POS_DATE) from T_POSITION_POS group by POS_VEHICULE)T2 on
T1.POS_DATE = T2.MAX_DATE

and T1.POS_VEHICULE= T2.POS_VEHICULE
La formulation 2 de "Steve Kass" reste la plus simple à appréhender.


Bien cordialement
Med Bouchenafa


a écrit dans le message de news:
uiOomn3$

Si la colonne POS_ID est la clé:

select
POS_VEHICULE, POS_DATE, POS_LATITUDE, POS_LONGITUDE
from T as T1
where POS_ID = (
select top 1 POS_ID
from T as T2
where T2.VEHICULE = T1.VEHICULE
order by POS_DATE desc
)

ou

select
POS_VEHICULE, POS_DATE, POS_LATITUDE, POS_LONGITUDE
from T as T1
where POS_DATE = (
select max(POS_DATE)
from T as T2
where T2.VEHICULE = T1.VEHICULE
)

ou

select
POS_VEHICULE, POS_DATE, POS_LATITUDE, POS_LONGITUDE
from T
where not exists (
select *
from T as T2
where T2.VEHICULE = T1.VEHICULE
and T2.POS_DATE > T1.POS_DATE
)

Steve Kass
Drew University




Laurent HOUTANT wrote:


Bonjour,
je n'arrive pas a ecrire la requete suivante:
dans une table T_POSITION_POS
POS_ID
POS_VEHICULE
POS_DATE
POS_LATITUDE
POS_LONGITUDE

je souhaite obtenir la chose suivante:

POS_VEHICULE, POS_DATE,POS_LATITUDE,POS_LONGITUDE
ou chaque ligne correspond a la derniere position de chaque véhicule.
je pense bien a GROUP BY (POS_VEHICULE) et MAX(POS_DATE) mais comment
puis je afficher POS_LATITUDE et POS_LONGITUDE correspondant à GROUP BY
(POS_VEHICULE) et MAX(POS_DATE).
Merci pour votre aide














Avatar
Fred BROUARD
tu as raison il faut le faire dans le HAVING.

Voila ce que c'est quand les posteur de news ne te donne pas leu jeu d'essais !

select POS_VEHICULE, POS_DATE, POS_LATITUDE, POS_LONGITUDE
from T as T1
CROSS JOIN T as T2
where T1.VEHICULE = T2.VEHICULE
GROUP BY T1.VEHICULE, T2.VEHICULE
HEVING T1.POS_DATE = max(T2.POS_DATE)

A +

Med Bouchenafa a écrit:
C'est peut-être élègant et même intuitif mais faux
SQL n'accepte pas de fonctions d'agrégation (MAX ici) dans la clause WHERE




--
Frédéric BROUARD, MVP SQL Server. Expert SQL / spécialiste Delphi, web
Livre SQL - col. Référence : http://sqlpro.developpez.com/bookSQL.html
Le site du SQL, pour débutants et pros : http://sqlpro.developpez.com
************************ www.datasapiens.com *************************
Avatar
Fred BROUARD
tu as raison il faut le faire dans le HAVING.

Voila ce que c'est quand les posteur de news ne te donne pas leu jeu d'essais !

select POS_VEHICULE, POS_DATE, POS_LATITUDE, POS_LONGITUDE
from T as T1
CROSS JOIN T as T2
where T1.VEHICULE = T2.VEHICULE
GROUP BY T1.VEHICULE, T2.VEHICULE
HEVING T1.POS_DATE = max(T2.POS_DATE)

A +

Med Bouchenafa a écrit:
C'est peut-être élègant et même intuitif mais faux
SQL n'accepte pas de fonctions d'agrégation (MAX ici) dans la clause WHERE




--
Frédéric BROUARD, MVP SQL Server. Expert SQL / spécialiste Delphi, web
Livre SQL - col. Référence : http://sqlpro.developpez.com/bookSQL.html
Le site du SQL, pour débutants et pros : http://sqlpro.developpez.com
************************ www.datasapiens.com *************************