Vous n'êtes pas identifié(e).
- Contributions : Récentes | Sans réponse
Pages : 1
#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é )
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
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
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)
damien clochard
http://dalibo.org | http://dalibo.com
Hors ligne
Pages : 1