2010-04-28 4 views
2

J'ai une question sql/sqlite. J'ai besoin d'écrire une requête qui sélectionne certaines valeurs d'une table de base de données sqlite. Je veux toujours que les enregistrements retournés au maximum soient de 20. Si le total des enregistrements sélectionnés est supérieur à 20, je dois sélectionner 20 enregistrements qui sont répartis uniformément (pas au hasard) sur le total des enregistrements. Il est également important que je sélectionne toujours la première et la dernière valeur de la table lors du tri de la date. Ces enregistrements doivent être insérés en premier et en dernier dans le résultat.Sqlite: Sélection des enregistrements répartis sur les enregistrements totaux

Je sais comment accomplir ceci dans le code mais ce serait parfait pour avoir une requête sqlite qui peut faire la même chose.

La Im requête à l'aide est vraiment simple et ressemble à ceci:

"SELECT value,date,valueid FROM tblvalue WHERE tblvalue.deleted=0 ORDER BY DATE(date)" 

Si je par exemple avoir ces enregistrements dans la talbe et de faire un exemple plus facile le résultat maximum que je veux est 5.

id value date 
1  10  2010-04-10 
2  8  2010-04-11 
3  8  2010-04-13 
4  9  2010-04-15 
5  10  2010-04-16 
6  9  2010-04-17 
7  8  2010-04-18 
8  11  2010-04-19 
9  9  2010-04-20 
10 10  2010-04-24 

Le résultat que je voudrais est uniformément répartie comme ceci:

id value date 
1  10  2010-04-10 
3  8  2010-04-13 
5  10  2010-04-16 
7  8  2010-04-18 
10 10  2010-04-24 

espoir que e xplain ce que je veux, merci!

+0

Que voulez-vous dire par « je dois sélectionner 20 dossiers qui sont répartis sur les dossiers au total "? – SQLighter

+1

Je pense qu'il veut dire randomisé sur l'ensemble, c'est-à-dire ordonné par un facteur aléatoire –

+0

Désolé, je n'étais pas clair, je ne veux pas aléatoire. S'il vous plaît voir la question mise à jour ci-dessus. Merci! – Mrbiggerm

Répondre

0

Je pense que vous voulez ceci:

SELECT value,date,valueid FROM tblvalue WHERE tblvalue.deleted=0 
ORDER BY DATE(date), Random() 
LIMIT 20 
+0

Citation de l'OP: "Il est également important que je sélectionne toujours la première et la dernière valeur de la table quand trié sur la date" –

+0

Merci, mais je voudrais que les disques soient répartis uniformément et non pas au hasard. Je n'étais pas clair avant, mis à jour ma question. – Mrbiggerm

2

Quelque chose comme cela devrait fonctionner pour vous:

SELECT * 
FROM (
    SELECT v.value, v.date, v.valueid 
    FROM tblvalue v 
    LEFT OUTER JOIN (
     SELECT min(DATE(date)) as MinDate, max(DATE(date)) as MaxDate 
     FROM tblvalue 
     WHERE tblvalue.deleted = 0 
    ) vm on DATE(v.date) = vm.MinDate or DATE(v.date) = vm.MaxDate 
    WHERE tblvalue.deleted = 0 
    ORDER BY vm.MinDate desc, Random() 
    LIMIT 20 
) a 
ORDER BY DATE(date)  
+0

Cela retourne les enregistrements dans un ordre étrange. D'abord la date minimale, puis la date maximale, puis le 18 au milieu. Je pense qu'il a besoin d'une autre requête externe pour trier correctement. –

+0

@Sam: Oui, ce n'était pas spécifié, donc je l'ai sauté. La commande consiste à s'assurer que les dates min et max sont retournées. J'ai mis à jour pour inclure une requête externe pour le tri correct. – RedFilter

+0

Mais cela va juste sélectionner des enregistrements aléatoires? – Mrbiggerm

Questions connexes