2017-06-12 1 views
1

je les tables psql suivantes avec les colonnes suivantes:Comment construire une requête PSQL impliquant des valeurs max?

Library: 
    library_id 

Shelf: 
    shelf_id 
    library_id (Library foreign key) 
    forbidden = (boolean) 

Author 
    author_id 
    shelf_id (Shelf foreign key) 
    number_pages_witten 

Book 
    book_id 
    author_id (Author foreign key) 
    book_name 

je besoin d'une requête qui extrait le dos suivant:

Pour library_id = 5, obtenir la liste des noms de livres d'auteurs qui ont écrit le plus de pages par étagère, pour toutes les étagères qui ont « interdit » = Faux

j'ai les suivantes jusqu'à présent:

SELECT name FROM Book AS b 
INNER JOIN Author AS a 
ON b.author_id = a.author_id 
... 
... 
WHERE library_id=5 

Ma syntaxe sql est très faible. J'ai du mal à obtenir l'auteur avec le plus grand nombre de pages sur l'étagère arrière et le brancher au reste de la requête. Je vous remercie.

Répondre

0

L'exigence d'obtenir « auteurs qui ont écrit les plus pages par étagère, pour toutes les étagères qui ont « interdit »= False » est un usecase classique pour la fonction fenêtre rank(). À partir de là, vous avez juste besoin d'une requête interne:

SELECT name 
FROM book b 
WHERE b.author_id IN (SELECT author_id 
         FROM (SELECT a.author_id, 
           RANK() OVER 
             (PARTITION BY a.shelf_id 
             ORDER BY number_pages_written DESC) rk 
           FROM author a 
           JOIN shelf s ON a.shelf_id = a.shelf_id 
           WHERE library_id = 5) 
         WHERE rk = 1)