Как я могу использовать SQL, чтобы найти общее количество записей за определенный период времени? - PullRequest
1 голос
/ 12 сентября 2011

мои навыки SQL не достаточно сильны, чтобы понять это, надеюсь, кто-то может помочь.Это на SQLite для Android:

У меня есть таблица «попытки»:

attempt_id | word | score | attempt_time
----------------------------------------
1          | w1   | 1     | 2011-09-01
2          | w1   | 2     | 2011-09-02
3          | w2   | 1     | 2011-09-02
4          | w3   | 1     | 2011-09-03
5          | w4   | 0     | 2011-09-03
6          | w1   | 0     | 2011-09-04

Каждое слово имеет оценку, связанную с ним;Я хочу найти количество слов, которые имеют оценку> = 1 за каждый день.Результаты сохраняются со дня на день, поэтому оценка за день t должна быть отражена в день t + 1 .Когда слово набирает 0, оно не должно учитываться.Результат должен выглядеть примерно так:

attempt_time | count(word)
--------------------------
2011-09-01   | 1              // w1 (1)
2011-09-02   | 2              // w1, w2 (2)
2011-09-03   | 3              // w1, w2, w3 (3)
2011-09-04   | 2              // w2, w3 (2) (w1 now has score 0)

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

Это должно сделать что-то подобное, но нужно вседаты, а не только одна:

select count(distinct word) from attempts where score > 0 
and attempt_time <= '2011-09-03';

> 3

Моя альтернатива - создать отдельную таблицу, в которой просто будут отслеживаться итоги за каждый день, но тогда я должен синхронизировать данные.

Большое спасибо.

Редактировать: Я попытался добавить еще несколько деталей, чтобы сделать вопрос более понятным.Надеюсь, это поможет.

Ответы [ 3 ]

1 голос
/ 16 сентября 2011

Если вам нужно агрегировать и отображать счетчики на основе даты, которую вы хотите использовать в предложении «Группировать по».Попробуйте синтаксис ниже.

Select attempt_time, count(*) from attempts where score > 0 group by attempt_time

Вот еще один пример решения кем-то подобной проблемы. SELECT *, COUNT (*) в SQLite

0 голосов
/ 30 января 2012

Не похоже, что есть хороший способ сделать это.

0 голосов
/ 15 сентября 2011

Во-первых, я думаю, вы подразумеваете, что ваши результаты будут:

attempt_time | count(word)
--------------------------
2011-09-01   | 1              // w1 has score 1
2011-09-02   | 3              // w1 increased to 2, plus w2 has score 1
2011-09-03   | 5              // w1 and w2 same, w3 has score 1, w4 has no score
2011-09-04   | 5              // no change

Но вы не получите дату 4 сентября, так как ее нет в БД.Но в любом случае, Вам нужно это:

set @csum := 0;

select attempt_time, (@csum := @csum + score) as score from attempts where score > 0 and attempt_time <= '2011-09-03' group by attempt_time;

Что я просто украл из этого: Создать столбец накопленной суммы в MySQL (Большой до https://stackoverflow.com/users/50552/andomar)

Хм, это то, что вам нужно?:)

Трис ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...