PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#1 07/07/2010 11:23:41

dlamotte
Membre

aide pour une petite query sql (newbie)

Bonjour,
je dispose d'une table content avec 3 champs id,title,md5
et je veux retrouver tous les id dont la longueur des titres sont les plus courts pour un même md5

#select min(length(title)) as min  from content group by md5
sur base de cette query je ne vois pas trop comment faire, j'ai essayé des subquery et différentes choses
mais là je bloque

Bien à vous

#table
CREATE TABLE content
(
  id serial NOT NULL,
  title character varying(2000),
  md5 text,
  CONSTRAINT content_pkey PRIMARY KEY (id)
)
WITH (
  OIDS=FALSE
);

Hors ligne

#2 07/07/2010 11:30:05

Marc Cousin
Membre

Re : aide pour une petite query sql (newbie)

En quelle version ? 8.4 ? ou antérieure ?


Marc.

Hors ligne

#3 07/07/2010 11:31:39

dlamotte
Membre

Re : aide pour une petite query sql (newbie)

avec postgres 8.4 (pardon de ne pas l'avoir mentionné smile )

Hors ligne

#4 07/07/2010 12:07:52

Marc Cousin
Membre

Re : aide pour une petite query sql (newbie)

Dans ce cas, en 8.4, on peut le faire avec des 'window functions'.
J'ai mis ces données de test:

marc=# SELECT * from content;
 id |          title          |         md5         
----+-------------------------+---------------------
  1 | le beau danube bleu     | aaaaaaaaaaaaaaa
  2 | le beau danube pas bleu | aaaaaaaaaaaaaaa
  3 | tanhauser               | bbbbbbbbbbbbbbbbbbb
  4 | tristan et iseult       | bbbbbbbbbbbbbbbbbbb


SELECT rank() over (PARTITION BY md5 ORDER BY length(title) ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS classement, title, md5 from content;

 classement |          title          |         md5         
------------+-------------------------+---------------------
          1 | le beau danube bleu     | aaaaaaaaaaaaaaa
          3 | le beau danube pas bleu | aaaaaaaaaaaaaaa
          1 | tanhauser               | bbbbbbbbbbbbbbbbbbb
          2 | les walkiries           | bbbbbbbbbbbbbbbbbbb
          3 | tristan et iseult       | bbbbbbbbbbbbbbbbbbb

De là, on peut faire une sous requête:

SELECT tmp.title, tmp.md5 FROM (SELECT rank() over (PARTITION BY md5 ORDER BY length(title) ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS classement, title, md5 from content) AS tmp WHERE classement = 1;

        title        |         md5         
---------------------+---------------------
 le beau danube bleu | aaaaaaaaaaaaaaa
 tanhauser           | bbbbbbbbbbbbbbbbbbb
(2 rows)

Dernière modification par Marc Cousin (07/07/2010 12:09:08)


Marc.

Hors ligne

#5 07/07/2010 12:11:52

dlamotte
Membre

Re : aide pour une petite query sql (newbie)

Merçi
je teste,partition est tout nouveau pour moi smile

Hors ligne

#6 07/07/2010 12:47:16

daamien
damien clochard

Re : aide pour une petite query sql (newbie)

damned ! Marc a été plus rapide moi smile


voila ma version :

SELECT id,l 
FROM ( 
     SELECT id, title, 
                 length(title) AS l, 
                 min(length(title)) OVER (PARTITION BY md5) AS m 
     FROM content
     ) AS s 
WHERE m=l;

Ce qui donne :

postgres=# select * from content;
 id |   title   | md5 
----+-----------+-----
  1 | 1         | z
  2 | 22        | z
  3 | 999999999 | z
  4 | 666666    | y
  5 | 4444      | y
  8 | 8         | z

postgres=# SELECT id,title,m FROM ( SELECT id, title, length(title) as l, min(length(title)) OVER (PARTITION BY md5) as m FROM content) AS s where m=l;
 id | title | m 
----+-------+---
  5 | 4444  | 4
  1 | 1     | 1
  8 | 8     | 1
(3 lignes)

Hors ligne

Pied de page des forums