2010-10-25 8 views
0

снова Я застрял в подсчете чего-то в MySQL. Структура базы данных далека от SOers'd-вызова оптимальным, но, тем не менее, я здесь не влияю и вынужден жить с ней. Вероятно that's одна из причин, почему я должен помочь еще раз, чтобы получить некоторую информацию из него :)Учитывать изменения значения с течением времени?

Предположим, у меня есть: some_id (не PK таблицы, не единственный), год, месяц (без поля даты только два целочисленных поля), some_flag (символ, который является либо A, либо B).

Теперь я хотел бы знать, как часто изменяется some_flag (за определенный промежуток времени). Временной интервал не очень важен в первом подходе, мне просто нужно знать, сколько изменений произошло. Обратите внимание, что изменения могут происходить только ежемесячно. Мой запрос:

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 

возвращает пустой набор результатов. Что с этим не так? Я уверен, что есть лет, в которых флаг изменения в течение месяца ...

не является чем-то вроде

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

возможно?

+0

Можете ли вы разместить некоторые данные примера и какой результат вы хотите, пожалуйста? –

ответ

0

При группировке по some_flag вы делаете COUNT(DISTINCT some_flag) быть всегда 1.

Попробуйте gouping только some_id. Надеюсь, это поможет.

2

Попробуйте это:

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-
Если вы хотите увидеть в месяц за месяц подсчета, попробуйте следующее:
(Примечание: это только покажет месяцев, где она изменилась)

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

Это близко ... но, к сожалению, он просто возвращает общее количество идентификаторов, а не только число номеров. Это будет работать только в том случае, если в один момент времени (some_id) в наборе есть только одно наблюдение. Наверное, я бы постарался опубликовать этот связанный сценарий. –

+0

Есть ли столбец с количеством внесенных изменений? Ваш вопрос не указывает на это. –

+0

Если есть столбец с числом изменений, вы можете заменить 'COUNT (some_id)' на 'SUM (num_changes)'. –

2

Мне кажется, что вам нужно сделать это в двух частях.

Во-первых, выполнить этот SQL запрос, чтобы получить все значения для some_id, some_flag:

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

Затем запустите выход через процесс/слияния матча для обнаружения, когда some_flag изменения для данного some_id. Сохраните год и месяц, чтобы some_flag изменений для отчетности в процессе совпадения/слияния.

+0

Yup, это то, что я пытаюсь настроить в настоящее время и в основном причина, почему я пытаюсь удачи с другим языком прямо сейчас ... –

Смежные вопросы