2017-06-15 3 views
0

Je suis actuellement à la recherche d'une base de données de notation dans SQLite 3.8.7.1 (Debian Jessie) et j'ai quelques difficultés à obtenir les agrégats que je veux à partir d'une seule requête pour retourner à une application web. Dragage à travers mes souvenirs de classes SQL à uni et beaucoup de documentation, j'ai une requête qui trouve la note totale, plus les nombres positifs et négatifs pour chaque élément étant évalué, mais je ne suis pas convaincu que j'ai a eu une façon sensée de le faire, ou que ça va être particulièrement efficace.Puis-je éliminer les sous-requêtes lors du calcul de plusieurs agrégats dans SQLite?

Les os nus sont sur sqlfiddle.com comme http://www.sqlfiddle.com/#!7/a71acb/1

Essentiellement, j'ai une clé d'élément, puis le nom d'utilisateur de la personne sa notation, un champ linguistique actuellement fixé à NULL dans tous les cas, la date de la notation et soit 1 ou -1 dans le champ de valeur. Je veux retourner un tableau de tous les articles, avec des colonnes pour le nombre de notes positives, le nombre de notes négatives et la note globale (positif moins négatif). Puis-je supprimer les sous-requêtes d'une manière ou d'une autre ou les rendre plus efficaces?

Y a-t-il des approches alternatives que je peux poursuivre dans SQLite?

En fait, ma requête renvoie un nombre négatif pour les évaluations négatives totales; Puis-je rendre cela positif?

Répondre

0

Voici une proposition basée sur les fonctions d'agrégat
sur la base d'une expression de table commune avec un group-by à deux clés.

J'ai changé les valeurs des négatifs à représenter comme un nombre positif,
mais bien sûr ils sont comptés négatifs.
J'ai également évité les entrées "NULL", les considérant moche et il s'assure également que min/max retourne leur côté de 0, ou 0.
Sinon, je crois que le résultat est la sortie désirée.

with subtotals(titem, subtotal) as 
(select item 
     , sum(value) 
from ratings 
group by item, value) 
select titem as item 
    , sum(subtotal) as total 
    , max(0, max(subtotal)) as pos 
    , -1*min(0, min(subtotal)) as neg 
from subtotals 
group by titem; 

sortie (.width 20, .headers on, .mode columns):

item     total  pos   neg 
-------------------- ---------- ---------- ---------- 
africa    1   2   1 
cant-buy-me-love  3   3   0 
happy-together  -2   0   2 
solitaire    0   1   1 

Vous comptera probablement l'expression de table commune comme une sous-requête, mais il est seul.
Les tests de vitesse ont probablement besoin du contenu complet de la base de données, pas du petit violon.