Précédent   Forum des professionnels en informatique > Bases de données > Langage SQL
Langage SQL Forum d'entraide sur le langage SQL et sur les questions liées à la conception de schéma (DDL). Cours SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 03/08/2011, 04h52   #1
Membre régulier
 
Inscription : mai 2007
Messages : 144
Détails du profil
Informations forums :
Inscription : mai 2007
Messages : 144
Points : 78
Points : 78
Par défaut Difficulté pour une requête a priori simple

Bonjour à tous,



Je suis en train d'implémenter un système de messagerie. Voici ma table :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
CREATE TABLE messages (
 
  sender
    CHARACTER VARYING (15)
    NOT NULL,
 
  receiver
    CHARACTER VARYING (15)
    NOT NULL,
 
  text
    TEXT
    NOT NULL,
 
  date
    DATE
    DEFAULT CURRENT_DATE
    NOT NULL,
 
  time
    TIME WITH TIME ZONE
    DEFAULT CURRENT_TIME
    NOT NULL
 
);
Je souhaite simplement : afficher le dernier message envoyé par chaque expéditeur.

- Le problème rencontré : je n'arrive à filtrer les doublons de mon jeu de résultats (vu qu'un expéditeur peut envoyer plusieurs messages).

- J'ai essayé avec GROUP BY, mais je ne sais pas comment agréger la colonne "text" aux résultats.

- Et un "DISTINCT ON (sender)" n'autorise pas les tris sur "date" et "time".

Merci beaucoup pour votre aide ! (J'utilise PostgreSQL.)
Evocatii est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/08/2011, 08h15   #2
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 638
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 638
Points : 2 630
Points : 2 630
Bonjour si vous utilisez une version récente de PostegreSql vous pouvez utiliser les fonctions de fenêtrages :

Code :
1
2
3
4
5
6
7
8
 
WITH TMP AS (
SELECT sender, text, date, time, row_number() over(partition BY sender ORDER BY date DESC, time DESC) AS rnk
FROM messages)
 
SELECT sender, text, date, time
FROM tmp
WHERE rnk = 1
Sinon vous pourriez peut-être remplacer vos colonne "date", et "time" par un timestamp... et n'appellez pas vos colonne avec des mots reservés à votre SGBD ça peut foutre le bordel.


Enfin, niveau modélisation il y aurait peut-être des choses à revoir ..
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/08/2011, 21h19   #3
Membre régulier
 
Inscription : mai 2007
Messages : 144
Détails du profil
Informations forums :
Inscription : mai 2007
Messages : 144
Points : 78
Points : 78
Merci pour ton aide, punkoff !

Je ne connaissais pas ces fonctions "window". C'est super !

Bref, j'ai réussi à faire ce que je voulais :

Code :
1
2
3
4
5
SELECT DISTINCT sender, FIRST_VALUE(text) OVER (PARTITION BY sender ORDER BY timestamp DESC) AS text, MAX(timestamp) OVER (PARTITION BY sender) AS timestamp
 
FROM mail.messages
 
ORDER BY timestamp
Bonne soirée et merci encore !



P.S : Pour les mots clés, apparemment PostgreSQL autorise date, time, timestamp et text. Mais effectivement, ce n'est pas le cas de toutes les bases de données.
Evocatii est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 12h17.


 
 
 
 
Partenaires

Hébergement Web