Как я могу считать записи только один раз за определенный промежуток времени? - PullRequest
2 голосов
/ 27 января 2012

У меня есть таблица со статистическими данными.

Я пытаюсь подсчитать записи, сгруппированные по версии, проблема в том, что записи имеют другой критерий (ссылка) и должны учитываться только один раз (для ссылки).

Пример данных статистики для иллюстрации проблемы:

id stat_date  ref version
-------------------------
1  2012-01-25   1  A
2  2012-01-25   2  B
3  2012-01-25   3  A
4  2012-01-26   8  B
5  2012-01-26   2  B
6  2012-01-26   3  B  <-- version has been updated for ref=3

Простой подсчет вернул бы

SELECT COUNT(*),version FROM stat GROUP BY version

1,A
5,B

Проблема здесь в том, что только последняя запись с ref = 3(id = 6) должен учитываться, а (id = 3) должен игнорироваться.Итак, вопрос в том, как я могу отфильтровать строку (id = 3) из запроса?

Я не могу понять, что я должен вставить в качестве условия в подзапросе

SELECT COUNT(*),version FROM stats
WHERE  stat_date BETWEEN "2012-01-25"  AND "2012-01-26" 
AND id = (SELECT MAX(id) FROM stats WHERE <condition>)
GROUP BY 2

ожидаемый результат будет:

1,A (since id=3 is ignored)
3,B (since the first id=2 is ignored and only id=5 is taken into account)

Ответы [ 3 ]

2 голосов
/ 27 января 2012

Неважно, какую строку вы игнорируете.Все, что вам нужно, это сосчитать ref один раз.

SELECT COUNT(DISTINCT ref),version FROM stat GROUP BY version

Редактировать:

В вашем примере следует также сосчитать 2 строки, где ref = 2, а также в соответствии с вашей логикой.1007 * Этот ответ удовлетворяет поставленным вопросам, даже если он не решает вашу неизвестную реальную проблему

1 голос
/ 27 января 2012

Попробуйте:

SELECT COUNT(*),version 
FROM stats s1
WHERE stat_date BETWEEN "2012-01-25"  AND "2012-01-26" AND
      not exists (SELECT null 
                  FROM stats s2 
                  WHERE s1.ref = s2.ref and s2.id>s1.id)
GROUP BY version

РЕДАКТИРОВАТЬ: Не гарантируется, что всегда будет работать:

SELECT COUNT(*),version from
(select * from
 (select * from stats 
  where stat_date BETWEEN "2012-01-25"  AND "2012-01-26" 
  order by ref, id desc) s0
 group by ref) s1
group by version
0 голосов
/ 27 января 2012
SELECT COUNT(*),version FROM stats
   WHERE  stat_date BETWEEN "2012-01-25"  AND "2012-01-26" 
       AND id = (SELECT MAX(s.id) FROM stats s WHERE s.id = id)
   GROUP BY version
   ORDER BY stat_date
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...