2010-06-10 6 views
5

J'utilise MySQL et je le tableau suivant:groupe par tranche de date semaines/mois d'intervalle

| clicks | int | 
| period | date | 

Je veux être en mesure de générer des rapports comme celui-ci, où les périodes se font dans les 4 derniers semaines:

| period | clicks | 
| 1/7 - 7/5 | 1000 | 
| 25/6 - 31/7 | .... | 
| 18/6 - 24/6 | .... | 
| 12/6 - 18/6 | .... | 

ou au cours des 3 derniers mois:

| period | clicks | 
| July | .... | 
| June | .... | 
| April | .... | 

Toute idée comment faire des requêtes sélection qui peuvent générer la equivale La plage de dates et les clics nt comptent-ils?

+1

Vous stockez votre date comme int? À quoi ressemble ce champ? – simendsjo

+0

@simendsjo Confusion Formatage - Je pensais la même chose, mais lire à travers pas! –

+0

désolé pour cette erreur, c'est une période appelée avec le type de date. – khelll

Répondre

11
 
SELECT 
WEEKOFYEAR(`date`) AS period, 
SUM(clicks) AS clicks 
FROM `tablename` 
WHERE `date` >= CURDATE() - INTERVAL 4 WEEK 
GROUP BY period 

SELECT 
MONTH(`date`) AS period, 
SUM(clicks) AS clicks 
FROM `tablename` 
WHERE `date` >= CURDATE() - INTERVAL 3 MONTH 
GROUP BY period 

+0

C'est une meilleure vérification pour la période, j'ai corrigé ma réponse pour le refléter. – Keeper

+0

Par curiosité, comment les requêtes devraient être si le champ de période est un entier comme 20100609 qui correspond à la date du 2010-06-09. Est-ce que la performance serait meilleure dans un tel type d'int? – khelll

+0

Probablement seulement si vous avez besoin de filtrer une plage de dates car vous ne pouvez pas filtrer par semaine (vous devez toujours le convertir en date). Et n'oubliez pas de choisir une réponse: P – Keeper

3

Pour les 3 derniers mois, vous pouvez utiliser:

SELECT MONTH(PERIOD), SUM(CLICKS) 
FROM TABLE 
WHERE PERIOD >= NOW() - INTERVAL 3 MONTH 
GROUP BY MONTH(PERIOD) 

ou pour les 4 dernières semaines:

SELECT WEEK(PERIOD), SUM(CLICKS) 
FROM TABLE 
WHERE PERIOD >= NOW() - INTERVAL 4 WEEK 
GROUP BY WEEK(PERIOD) 

code non testé.

+0

Je ne sais pas si l'optimiseur fonctionne avec SEMAINE (Période) sans vérifier toutes les dates dans le résultat. C'est pourquoi j'aime utiliser WEEK (Période) AS WeekPeriod, Grouper par WeekPeriod – simendsjo

+0

J'utilise principalement Oracle pour lequel vous devez regrouper par le même champ que vous sélectionnez (vous ne pouvez pas alias un champ et un groupe par là). Je pense que la requête est la même en interne. – Keeper