Exemple de tableau:
id computer app version build date
---|---------|------|------------|-------|---------
1 | aaaa1 | app1 | 1.0.0 | 1 | 2013-11-11 09:51:07
2 | aaaa1 | app2 | 2.0.0 | 2 | 2013-11-12 09:51:07
5 | xxxx2 | app1 | 1.0.0 | 1 | 2013-11-13 09:51:07
3 | cccc3 | app2 | 3.1.0 | 1 | 2013-11-14 09:51:07
4 | xxxx2 | app1 | 1.0.0 | 2 | 2013-11-15 09:51:07
5 | cccc3 | app2 | 3.1.1 | 3 | 2013-11-16 09:51:07
6 | xxxx2 | app1 | 1.0.2 | 1 | 2013-11-17 09:51:07
7 | aaaa1 | app1 | 1.0.2 | 3 | 2013-11-18 09:51:07
Sortie souhaitée (format et ordre de classement non exacts), obtenant la dernière installation pour chaque application sur chaque ordinateur:
7. aaaa1 - app1 - 1.0.2 - 3 - 2013-11-18 09:51:07
2. aaaa1 - app2 - 2.0.0 - 2 - 2013-11-12 09:51:07
6. xxxx2 - app1 - 1.0.2 - 1 - 2013-11-17 09:51:07
5. cccc3 - app2 - 3.1.1 - 3 - 2013-11-16 09:51:07
Ma déclaration SQL:
SELECT
id,
computer,
app,
version,
build,
MAX(date) AS installed
FROM
data
WHERE
placement = 'xxx'
GROUP BY
app, computer
;
Cela me donne:
1. aaaa1 - app1 - 1.0.0 - 1 - 2013-11-11 09:51:07
et pas
7. aaaa1 - app1 - 1.0.2 - 3 - 2013-11-18 09:51:07
comme je l'attendais.
MAX (date) fonctionne si jeSEULEMENTsélectionne MAX (date) et rien d’autre. Mais alors je ne reçois aucune donnée avec laquelle travailler (juste la date la plus récente).
SELECT
MAX(date) AS installed
Je ne suis pas un ninja SQL alors je vais vite me sentir chauve en me gratifiant la tête à cause de cela.
Essayez comme ça:
SELECT d.id, d.computer, d.app, d.version, d.build, a.installed
FROM data d
INNER JOIN (
SELECT computer, app, max(DATE) AS installed
FROM data
GROUP BY computer, app
) a ON a.computer = d.computer AND a.app = d.app
WHERE placement = 'xxx'
La requête interne vous donne le maximum (date) pour chaque paire d’ordinateurs et d’applications, puis rejoignez-la simplement pour obtenir le reste des informations.
Essayez en convertissant le champ Date/heure
SELECT
id,
computer,
app,
version,
build,
MAX(cast(date as Datetime)) AS installed
FROM
data
WHERE
placement = 'xxx'
GROUP BY
app, computer, id, version, build
;
Quel est le problème avec:
SELECT
id,
computer,
app,
version,
build,
`date` AS installed
FROM
data
WHERE
placement = 'xxx'
ORDER BY installed DESC
GROUP BY app;
C'est peut-être parce que vous stockez votre date sous forme de chaîne et que la comparaison d'une chaîne agit différemment de la comparaison d'un entier. Vous devriez stocker votre date au format unix Timestamp , et ils seront beaucoup plus faciles à comparer. Mais il faudra un effort supplémentaire pour être affiché comme date anglaise normale.
MAX ne fonctionnait pas pour moi, ce qui a fonctionné était une sous-requête supplémentaire pour laquelle j'ai pré-commandé un tableau par date:
SELECT d.id, d.computer, d.app, d.version, d.build, a.installed
FROM data d
INNER JOIN (
SELECT computer, app, date as installed
FROM (
SELECT computer, app, date
FROM data
ORDER BY date desc
) as t
GROUP BY computer, app
) a ON a.computer = d.computer AND a.app = d.app
WHERE placement = 'xxx'
max - est une fonction d'agrégat essaye d'ajouter toutes les colonnes de l'instruction select à GROUP BY
:
GROUP BY
app, computer, id, version, build.