2017-03-29 6 views
2

J'ai le tableau suivant (Mtable)SQL Déclaration fournit des résultats inattendus

id | sent     | number  
--------------------------------------- 
23 | 2017-03-02 00:00:00 | 0 
23 | 2017-03-04 00:00:00 | 0 
45 | 2017-03-15 00:00:00 | 1.8 
45 | 2017-03-17 00:00:00 | 1.9 

id: integer, not unique, no primary key 
sent: timestamp 
number: float 

La requête SQL:

SELECT DISTINCT `id`, number as mynum, MAX(`sent`) AS sentOn FROM `mTable` GROUP BY `id` 

Le résultat est:

id | mynum | sentOn 
------------------------------------ 
23 | 0  | 2017-03-04 00:00:00 
45 | 1.8 | 2017-03-17 00:00:00 

attendus le résultat serait:

id | mynum | sentOn 
------------------------------------ 
23 | 0  | 2017-03-04 00:00:00 
45 | 1.9 | 2017-03-17 00:00:00 

Dans la deuxième rangée je m'attendrais à être le mynum (1.9) avec la dernière date d'envoi (2017-03-17 00:00:00). À la place, SQL-Query fournit le mynum (1.8) à partir de la deuxième date d'envoi la plus récente (2017-03-15 00:00:00).

Des astuces pour résoudre le problème? Merci

Répondre

1

L'agrégation est la mauvaise façon d'obtenir la valeur la plus récente. Voici une façon plus appropriée:

select m.* 
from mtable m 
where m.sent = (select max(m2.sent) from mtable m2 where m.id = m2.id); 
0

Si vous voulez que la valeur maximum pour mynum aussi bien, alors vous devez appliquer MAX sur mynum, par exemple:

SELECT `id`, MAX(number) as mynum, MAX(`sent`) AS sentOn 
FROM `mTable` 
GROUP BY `id` 
0

Vous utilisez Group By article qui est faux . Utilisez la fonction d'agrégation dans votre select puis utilisez Group By .. Tels que ci-dessous:

SELECT id, MAX(number) as mynum, MAX(sent) AS sentOn 
FROM mTable 
GROUP BY id 

Ce lien aide à environ Grouper par article.

Helping Link For Group By

+0

ce groupe par la clause n'est pas mal, dans une base MySQL ce type de syntaxe est allowed..while serveur SQL ne permet pas –

+0

oui il est permis, mais il donnera un résultat erroné. –