Vous n'êtes pas identifié(e).
Pages : 1
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
En quelle version ? 8.4 ? ou antérieure ?
Marc.
Hors ligne
avec postgres 8.4 (pardon de ne pas l'avoir mentionné )
Hors ligne
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
Merçi
je teste,partition est tout nouveau pour moi
Hors ligne
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