2014-06-21 6 views
0

Voici la réplique de ma table. Comme vous pouvez le voir ci-dessous, la ligne est classée par identifiant et par date.Tableau de tri par points et dates

id  |  date   | points 
1   Jan 1, 2014    110 
2   Feb 12, 2014   20 
3   Mar 23, 2014   40 
4   Apr 10, 2014   80 
5   May 20, 2014   30 
6   June 3, 2014   60 
7   Jan 15, 2014   10 
8   Mar 5, 2014    70 
9   Feb 8, 2014    50 
10   June 10, 2014   5 

Mon but est de commander la ligne par des points qui se situe entre 50 à 10 (par ordre décroissant) et est également proche de la date actuelle. Comment puis-je atteindre cet objectif?

Toutes les lignes doivent être inclus dans un résultat final

+0

Pouvez-vous fournir à quoi le résultat devrait ressembler, il n'est pas clair de savoir si vous voulez des lignes qui se trouvent en dehors de 10-50, et si oui, comment ils devraient être triés – Lennart

Répondre

0

Quelque chose comme ça:

SELECT *, CASE WHEN (points >= 10 AND points <= 50) THEN 1 ELSE 0 END AS order_points  
    FROM points 
ORDER BY 
    order_points DESC, 
    CASE 
     WHEN order_points = 1 THEN points 
    END DESC, DATEDIFF(date, NOW()) 
+0

Comme je l'ai dit "Toutes les lignes doivent être incluses résultat final". Cela va exclure certaines lignes – user3740975

+0

Si vous voulez des points entre 50 et 10, vous n'aurez pas toutes vos lignes, ou je ne comprends pas? –

+0

Je veux juste que toutes les lignes entre 50-10 ET soient les plus proches en date actuelle pour être en haut, les autres lignes seront décalées vers le bas des lignes .. – user3740975

0

Un peu de deviner:

select a_date,points 
from t 
order by case when points between 10 and 50 then -1 else 1 end * points 
    , abs(DATEDIFF(a_date, now())); 

Pour un sous-ensemble de vos données:

+------------+--------+ 
| a_date  | points | 
+------------+--------+ 
| 2014-03-23 |  40 | 
| 2014-02-12 |  20 | 
| 2014-06-10 |  5 | 
| 2014-04-10 |  80 | 
| 2014-01-01 | 110 | 
+------------+--------+ 
+0

Cela ne fonctionne pas, l'erreur indique Vous avez une erreur dans votre syntaxe SQL; consultez le manuel qui correspond à votre version du serveur MySQL pour la bonne syntaxe à utiliser près de 'ordre par cas quand les points entre 10 et 50 puis -1 sinon 1 fin * points' à la ligne 10 – user3740975

+0

Si c'est mysql pourquoi ne l'étiez-vous pas? comme ça? Maintenant, j'ai deviné que de toute façon et testé avec '5.5.37-MariaDB'. Quelle version utilisez-vous? – Lennart

+0

Pouvez-vous créer un violon? La partie du cas n'a pas du tout de sens – user3740975

0
SELECT * 
FROM MyTable 
order by CASE WHEN Points BETWEEN 10 AND 50 THEN 0 ELSE 1 END, TheDate desc; 

ID TheDate Points 
-- --------- ------ 
5 20-MAY-14  30 
3 23-MAR-14  40 
2 12-FEB-14  20 
9 08-FEB-14  50 
7 15-JAN-14  10 
10 10-JUN-14  5 
6 03-JUN-14  60 
4 10-APR-14  80 
8 05-MAR-14  70 
1 01-JAN-14  110