Сгруппируйте по двум столбцам, чтобы получить уникальный результат

Я хочу сгруппировать результаты из одной таблицы по двум столбцам: created_at p_id, мне нужно сгруппировать их по p_id, потому что мне нужны уникальные значения, и я пытался использовать distinct для этого, но в моем случае это не сработало так, как я хотел .

Report.group("date(created_at)").group(:p_id).select("date(created_at) as created_at, count(*) as count, p_id")

r = _
r.count will generate this:
{[Mon, 18 Nov 2013, 11]=>1, [Mon, 18 Nov 2013, 8]=>1, [Mon, 18 Nov 2013, 13]=>1, [Mon, 18   Nov 2013, 12]=>3, [Mon, 18 Nov 2013, 10]=>1, [Mon, 18 Nov 2013, 7]=>1, [Mon, 18 Nov 2013, 3]=>1, [Mon, 18 Nov 2013, 2]=>1, [Mon, 18 Nov 2013, 9]=>1, [Mon, 18 Nov 2013, 14]=>1, [Mon, 18 Nov 2013, 6]=>1}

Но мне нужен результат в другом формате, что я должен добавить, чтобы получить что-то вроде этого: {Mon, 18 Nov 2013=>11} где 11 - это общее количество записей, сгенерированных приведенным выше оператором sql.

Спасибо.


person user2983193    schedule 18.11.2013    source источник
comment
я не понимаю вашего вопроса. пожалуйста, приведите лучший пример.   -  person phoet    schedule 18.11.2013
comment
Вы группируете по p_id, а затем хотите разгруппировать по тому же значению? Почему бы вам просто не удалить вызов group(:p_id)?   -  person marzapower    schedule 19.11.2013
comment
Я отредактировал свой вопрос, и, чтобы быть предельно ясным, я хочу получить за каждый день общее количество уникальных p_ids`.   -  person user2983193    schedule 19.11.2013


Ответы (1)


Если вы просто хотите подсчитать, сколько раз дата появляется в вашем результате, вы можете сделать это с помощью простого кода ruby:

result = result.inject ({}) do |hash, el| 
  hash[el[0][0]] ||= 0
  hash[el[0][0]] += 1
  hash
}

Предположим, что результат примерно такой:

{[date1, a] => b, [date1, c] => d, [date2, e] => f}

ты получишь

{date1 => 2, date2 => 1}

Если вы хотите получить значение count(*), связанное с датой, измените вызов суммы на это:

hash[el[0][0]] += el[1]

В этом случае вы получите:

{date1 => b+d, date2 => f}
person marzapower    schedule 18.11.2013
comment
Мои результаты похожи на ваши предположения, но все еще не работают. Это результат, который я получаю, выполняя приведенный выше SQL-запрос. [#<Report id: nil, p_id: 32, created_at: "2013-11-19">, #<Report id: nil, p_id: 43, created_at: "2013-11-19">, #<Report id: nil, p_id: 10, created_at: "2013-11-19">... Как я могу снова сгруппировать их по дате и подсчитать? Я думаю, это будет простое решение. - person user2983193; 19.11.2013
comment
Не могли бы вы уточнить, какой объект вы получаете из строки Report.group...? То, что вы пишете здесь, отличается от того, что вы выразили в вопросе. - person marzapower; 19.11.2013
comment
То, что я написал, - это то, что я получаю при выполнении запроса, то, что я написал в вопросе, - это то, что я получаю, если выполняю count по этому запросу. - person user2983193; 19.11.2013
comment
Ну тогда поставь result = Report.group ... .count и попробуй мой код. Он должен работать. - person marzapower; 19.11.2013
comment
Омг, я делал это 100 раз, и это не сработало, теперь это сработало, спасибо. - person user2983193; 19.11.2013