首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rails 4 ActiveRecord在postgreSQL数据库上优化高效的SQL查询?

Rails 4 ActiveRecord在postgreSQL数据库上优化高效的SQL查询?
EN

Stack Overflow用户
提问于 2014-08-22 00:37:11
回答 1查看 261关注 0票数 0

我不知道如何做到这一点,而不黑客完全荒谬和经验认为,有人可能会建议1或2行代码,将完全符合我的要求。我不知道该去哪找,所以我的问题是:

假设我想显示一个月的图表,到目前为止,每天注册。所以我需要一个高效的sql语句。

我想让它返回这样的哈希:

代码语言:javascript
复制
{ "2014-08-01"=>83, "2014-08-02"=>67, "2014-08-03"=>109, ... }

然后我可以用它生成一个很酷的图表!=)

所以我不知道如何写这个查询。有人能帮帮我吗?谢谢..。

这里是我的“黑客”尝试:

代码语言:javascript
复制
h = User.group("created_at").count
   (0.7ms)  SELECT COUNT(*) AS count_all, created_at AS created_at FROM "users"  GROUP BY created_at
 #=> {nil=>5, 2014-07-27 17:19:41 UTC=>1, 2014-07-19 00:23:54 UTC=>1, 2014-08-21 18:02:58 UTC=>1, 2014-08-21 18:39:31 UTC=>1, 2014-08-21 17:32:48 UTC=>1, 2014-08-21 17:21:46 UTC=>1, 2014-08-21 18:36:21 UTC=>1, 2014-08-21 16:29:37 UTC=>1, 2014-08-21 18:54:34 UTC=>1, 2014-08-21 17:56:24 UTC=>1, 2014-08-21 18:33:20 UTC=>1, 2014-08-21 16:27:17 UTC=>1, 2014-08-21 19:16:11 UTC=>1, 2014-08-21 18:41:14 UTC=>1, 2014-08-21 18:14:12 UTC=>1, 2014-08-21 18:30:46 UTC=>1, 2014-08-21 18:28:04 UTC=>1} 

dates = h.keys.compact.map {|j| j.to_s.match(/\d*-\d*-\d*/)[0] }

 #=> ["2014-07-27", "2014-07-19", "2014-08-21", "2014-08-21", "2014-08-21", "2014-08-21", "2014-08-21", "2014-08-21", "2014-08-21", "2014-08-21", "2014-08-21", "2014-08-21", "2014-08-21", "2014-08-21", "2014-08-21", "2014-08-21", "2014-08-21"] 

signUpHash = Hash.new 0
 #=> {} 
dates.map do |date|
signUpHash[date] += 1
end
 #=> [1, 1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15] 
signUpHash
 #=> {"2014-07-27"=>1, "2014-07-19"=>1, "2014-08-21"=>15} 
signUpHash.sort.to_h
 #=> {"2014-07-19"=>1, "2014-07-27"=>1, "2014-08-21"=>15} 

因此,虽然我的方式工作(这在某种程度上是因为它实际上没有考虑到到目前为止,这将需要更多的黑客),所以…(我知道有一种更好、更高效、更易读、更可靠、更可取、更推荐、更理想的.(你明白了).做这个的方法。请给我建议。谢谢!=)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-08-22 01:31:22

如果直接编写SQL,则使用date_trunc

您还没有显示表定义或示例数据,因此我不能真正测试它或编写完整的查询,但一般原则是:

代码语言:javascript
复制
SELECT date_trunc('month', created_at), count(created_at)
FROM mytable
GROUP BY date_trunc('month', created_at)
ORDER BY 1;

生成一个月中第一天的结果集,以计数成对,然后将其琐碎地消耗并聚合到客户机中的散列中。您可以在SQL查询中构建哈希,但是这样做并没有任何好处。

请注意,created_at上的索引不能用于此查询。如果希望将其限制在特定日期,请在created_at上使用一个created_at子句,而不是使用生成的date_trunc'd值。

如果您经常运行它,并且需要它很快,并且不介意额外索引的额外写入开销,那么您可以在这个月创建一个复合索引:

代码语言:javascript
复制
create index blahwhateverindexname on mytablename( (date_trunc('month', created_at) );
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25438004

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档