2010-10-25 15 views
0

encore je suis coincé avec compter quelque chose dans MySQL. La structure de la base de données est loin d'être optimale, mais je n'ai pas d'influence ici et je dois vivre avec. Probablement l'une des thats raisons pour lesquelles je encore besoin d'aide pour obtenir des informations sur ce :)Compte les changements d'une valeur au fil du temps?

On suppose que j'ai: some_id (pas le PK de la table, pas unique), année, le mois (pas champs de date seulement deux champs entiers), some_flag (caractère qui est A ou B).

Maintenant, j'aimerais savoir à quelle fréquence some_flag a changé (dans un laps de temps donné). Le laps de temps n'est pas très important dans la première approche, j'ai juste besoin de savoir combien de changements se sont produits. Notez que les modifications ne peuvent avoir lieu que tous les mois. Ma requête:

SELECT some_id,year,some_flag FROM mytable 
WHERE some_flag = "A" OR someflag = "B" 
AND year > 2005 
GROUP BY some_id,some_flag 
HAVING COUNT(DISTINCT some_flag) > 1 

renvoie un jeu de résultats vide. Qu'est ce qui ne va pas avec ça? Je suis sûr qu'il ya des années où les changements de pavillon au cours des mois ...

est-ce pas quelque chose comme

select .... , sum(case when month=month-1 and some_flag != some_flag then 1 else 0 end)  as changecount 

possible?

+0

Pouvez-vous poster des exemples de données et quelle sortie vous souhaitez, s'il vous plaît? –

Répondre

0

Lors du regroupement par some_flag vous faites COUNT(DISTINCT some_flag) toujours être 1.

Essayez gouping seulement par some_id. J'espère que ça aide.

2

Essayez ceci:

SELECT some_flag, COUNT(some_id) FROM mytable 
WHERE some_flag = "A" OR someflag = "B" 
AND year > 2005 
GROUP BY some_flag 
HAVING COUNT(some_id) > 1

-Edit-
Si vous voulez voir un mois sur le nombre de mois, essayez ceci:
(Note: il ne montrera mois où il a changé)

SELECT some_flag, year, month, COUNT(some_id) FROM mytable 
WHERE some_flag = "A" OR someflag = "B" 
AND year > 2005 
GROUP BY some_flag, month, year 
HAVING COUNT(some_id) > 1
+0

Ceci est proche ... mais malheureusement, il retourne juste le nombre total d'identifiants, et pas seulement le # nombre de changements. Cela ne fonctionnerait que s'il n'y avait qu'une seule observation à un moment donné (some_id) dans l'ensemble. Probablement, je ferais mieux de regarder pour poster cette question liée aux scripts. –

+0

Y a-t-il une colonne avec le nombre de changements effectués? Votre question ne l'indique pas. –

+0

S'il existe une colonne avec le nombre de modifications, vous pouvez remplacer COUNT (some_id) 'par SUM (num_changes)'. –

2

Il me semble que vous devez le faire en deux parties.

Tout d'abord, exécutez cette requête SQL pour obtenir toutes les valeurs pour some_id, some_flag:

SELECT some_id, some_flag, year, month 
FROM ... 
WHERE year > 2005 
ORDER BY some_id, some_flag, year, month 

Ensuite, exécutez la sortie par un processus de correspondance/fusion pour détecter quand some_flag changements pour un some_id donné. Enregistrez l'année et le mois pour lesquels les modifications some_flag doivent être enregistrées dans le processus de correspondance/fusion.

+0

Yup, c'est ce que j'essaie de mettre en place actuellement et essentiellement la raison pour laquelle je tente ma chance avec une autre langue en ce moment ... –