Le bout de code suivant fait son travail : il me donne les 10 premiers résultats pour chaque catégorie.

SELECT *
FROM (
SELECT *, RANK() OVER (PARTITION BY "pera_id" ORDER BY "surface" DESC) AS rnk
FROM "testBadaBing"
) AS x
WHERE rnk <= 10

Maintenant, j'aimerais ajouter des conditions afin que le nombre de résultats puisse varier en fonction d'un critère. Exemple : si "note" = 1, alors je veux retenir 1 résultat, sinon en faire 3.

J'ai essayé quelque chose du genre que vous pouvez voir ci-dessous en utilisant l'instruction CASE WHEN mais comme vous pouvez vous y attendre, cela ne fonctionne pas. Erreur renvoyée :

1 - près de "CASE": erreur de syntaxe

SELECT *
CASE WHEN "note" = 1 THEN
SELECT *
    FROM (
        SELECT *, RANK() OVER (PARTITION BY "pera_id" ORDER BY "surface" DESC) AS rnk
        FROM "testBadaBing"
    ) AS x
WHERE rnk <= 1
ELSE
SELECT *
    FROM (
        SELECT *, RANK() OVER (PARTITION BY "pera_id" ORDER BY "surface" DESC) AS rnk
        FROM "testBadaBing"
    ) AS x
WHERE rnk <= 3
END

Avez-vous des idées pour que cela fonctionne ? Ma connaissance de SQL est assez limitée. Le code doit être compatible SQLite/SpatiaLite car je travaille dans l'environnement QGIS. Merci.

0
stanichou 10 nov. 2020 à 14:27

1 réponse

Meilleure réponse

Vous pouvez utiliser la logique booléenne dans la clause WHERE de la requête externe :

SELECT *
FROM (
    SELECT t.*, 
        RANK() OVER (PARTITION BY "pera_id" ORDER BY "surface" DESC) AS rnk
    FROM "testBadaBing" t
) AS x
WHERE ("note" = 1 and rnk = 1) OR rnk <= 3
0
GMB 10 nov. 2020 à 11:34