2012-06-27 2 views
0

J'ai une table postgresql où je stocke des histoires de différents sites. À cette table, j'ai les champs story_id et site_id. Où story_id est la clé primaire et site_id est l'identifiant du site d'où j'ai eu cette histoire.Postgresql sélectionnant avec des valeurs limites égales?

Je dois faire SELECT à partir de cette table en sélectionnant les 30 dernières histoires ajoutées. Mais je ne veux pas obtenir plus de 2 étages de même site comming ...

Donc, si j'ai quelque chose comme ceci:

story_id | site_id 
    1  | 1 
    2  | 1 
    3  | 2 
    4  | 1 
    5  | 3 

Mes résultats doivent être: story_ids = 1,2,3, 5!
4 doit être sautées parce que je l'ai déjà pris 2 ids avec site_id 1.

+0

Veuillez définir "dernier". Sans champ de date (ou numéro de séquence) il n'y a pas de "dernier" – wildplasser

+0

latest = ORDRE BY story_id DESC J'ai écrit seulement 5 entrées, à ma table il y en a quelques milliers. – Svetoslav

+0

: = les (30) histoires avec le plus grand story_id. – wildplasser

Répondre

2
select story_id, 
     site_id 
from (
    select story_id, 
      site_id, 
      row_number() over (partition by site_id order by story_id desc) as rn 
    from the_table 
) t 
where rn <= 2 
order by story_id desc 
limit 30 

Si vous voulez plus ou moins de 2 entrées « par groupe », vous devez ajuster la valeur dans la partie extérieure clause where.

+0

Oui, cela a fonctionné parfaitement! Merci, juste un petit manque à la partition, l'ordre doit être réglé sur DESC aussi. Merci! – Svetoslav

+0

@Svetlio: Je n'étais pas sûr à ce sujet. Corrigée –

Questions connexes