Postgresql查询以获取在帐户创建后24小时内具有一些属性的用户
我正在尝试为Rails应用程序编写一个SQL查询,以获取在创建帐户后24小时内跟踪三个用户、跟踪三个标记并留下便条的用户数 模型结构为:Postgresql查询以获取在帐户创建后24小时内具有一些属性的用户,sql,ruby-on-rails,postgresql,datetime,Sql,Ruby On Rails,Postgresql,Datetime,我正在尝试为Rails应用程序编写一个SQL查询,以获取在创建帐户后24小时内跟踪三个用户、跟踪三个标记并留下便条的用户数 模型结构为: 用户模型在列中创建了一个ID和,而用户有许多后续和注释 Follows模型有一个与用户id匹配的跟随者id,一个跟随者类型,它要么是“用户”,要么是“标签”,还有一个在创建的 注释模型具有与用户id匹配的用户id,以及在处创建的 自从我的SQL技能不高以来,我还没走多远。我得到的最接近的(仍然很遥远)是这样的: select count(*) from
- 用户模型在列中创建了一个ID和
,而用户
有许多后续和注释
- Follows模型有一个与用户id匹配的
,一个跟随者id
,它要么是跟随者类型
,要么是“用户”
,还有一个在创建的“标签”
- 注释模型具有与用户id匹配的
,以及在处创建的用户id
select count(*)
from users
where created_at >=
(select follows.created_at
from follows
where follows.follower_id = users.id);
下面是一个可能的ActiveRecord解决方案。请注意,我只在IRB中测试了这方面的变体,您的模型可能与我的假设略有不同。另外,我不是SQL专家,因此这可能不高效
User
.joins("LEFT OUTER JOIN follows as fu on fu.follower_id = users.id AND fu.created_at < (users.created_at + interval '1 day') AND fu.follower_type = 'User'")
.joins("LEFT OUTER JOIN follows as ft on ft.follower_id = users.id AND ft.created_at < (users.created_at + interval '1 day') AND ft.follower_type = 'Tag'")
.joins("LEFT OUTER JOIN comments as c on c.user_id = users.id AND c.created_at < (users.created_at + interval '1 day')")
.group("users.id")
.having("COUNT(distinct fu.id)>=3 AND COUNT(distinct ft.id)>=3 AND COUNT(distinct c.id)>=1")
用户
.joins(“左外连接在fu.follower\u id=users.id和fu.created\u at<(users.created\u at+间隔'1天')和fu.follower\u type='User')
.joins(“左外部联接如下所示:ft.follower上的ft\u id=users.id和ft.created\u在<(users.created\u在+间隔“1天”)和ft.follower\u type='Tag')
.joins(“在c.user\u id=users.id和c.created\u at<(users.created\u at+间隔'1天')上以c形式保留外部联接注释”)
.group(“users.id”)
.具有(“计数(不同的fu.id)>=3,计数(不同的ft.id)>=3,计数(不同的c.id)>=1”)
您可以查看控制台输出,将其转换为原始SQL。这里是一个可能的ActiveRecord解决方案。请注意,我只在IRB中测试了这方面的变体,您的模型可能与我的假设略有不同。另外,我不是SQL专家,因此这可能不高效
User
.joins("LEFT OUTER JOIN follows as fu on fu.follower_id = users.id AND fu.created_at < (users.created_at + interval '1 day') AND fu.follower_type = 'User'")
.joins("LEFT OUTER JOIN follows as ft on ft.follower_id = users.id AND ft.created_at < (users.created_at + interval '1 day') AND ft.follower_type = 'Tag'")
.joins("LEFT OUTER JOIN comments as c on c.user_id = users.id AND c.created_at < (users.created_at + interval '1 day')")
.group("users.id")
.having("COUNT(distinct fu.id)>=3 AND COUNT(distinct ft.id)>=3 AND COUNT(distinct c.id)>=1")
用户
.joins(“左外连接在fu.follower\u id=users.id和fu.created\u at<(users.created\u at+间隔'1天')和fu.follower\u type='User')
.joins(“左外部联接如下所示:ft.follower上的ft\u id=users.id和ft.created\u在<(users.created\u在+间隔“1天”)和ft.follower\u type='Tag')
.joins(“在c.user\u id=users.id和c.created\u at<(users.created\u at+间隔'1天')上以c形式保留外部联接注释”)
.group(“users.id”)
.具有(“计数(不同的fu.id)>=3,计数(不同的ft.id)>=3,计数(不同的c.id)>=1”)
您可以查看控制台输出以将其转换为原始SQL。
选择follows.created_at from follows,其中follows.follower_id=users.id
这将返回已创建的_at数组,并将如何进行比较?我不知道你在问什么。你能解释一下吗?是的,那是我没讲的部分。我给出的查询只是我得到的最接近的查询,并且有几个部分被卡住了。你为什么要在原始SQL中这样做,而不是使用ActiveRecord?最终,我将绘制每天的计数图,我的数据仪表板/可视化工具使用原始SQL而不是ActiveRecord。不过我也很乐意接受ActiveRecord的答案。我唯一关心的是使用。to_sql
将为我提供实际的创建时间戳,而不是Postgres可以接受的灵活变量。选择follows.created_at from follows where follows.follower_id=users.id
这将返回创建时间的数组,它将如何比较?我不知道你在问什么。你能解释一下吗?是的,那是我没讲的部分。我给出的查询只是我得到的最接近的查询,并且有几个部分被卡住了。你为什么要在原始SQL中这样做,而不是使用ActiveRecord?最终,我将绘制每天的计数图,我的数据仪表板/可视化工具使用原始SQL而不是ActiveRecord。不过我也很乐意接受ActiveRecord的答案。我唯一关心的是使用。to_sql
将为我提供在时间戳创建的实际,而不是Postgres可以接受的灵活变量。你确定吗?如果用户创建时间为2017年10月30日08:00
,则在+1天创建的user.created_为2017年10月31日08:00
。如果评论是在2017年10月30日12:00创建的,那么我们希望该评论包含在计数中。所以'10/30/2017 12:00'<'10/31/2017 08:00'==true
,这就是上面测试的内容。刚刚克隆-将返回报告:)好的-我刚刚运行了上面的代码并返回了49个结果,这是自述文件建议的正确结果。看看我的fork:-我在用户模型中添加了一个类方法。尝试在控制台中运行User.test\u method.length
,看看是否得到相同的结果。还请注意,调用count
而不是length
将返回由于组调用而产生的哈希值。请参阅-当我调整User.test\u method.count
的输出时,接受答案中的第二个示例对我有效。我运行了原始查询,只剩下一行,count\u all
列设置为49。选择count(*)OVER()作为count\u all,users.id作为“users”左侧外部联接的users\u id如下:fu on fu.user\u id=users.id和fu.created\u at<(users.created\u at+间隔“1天”)fu.follower_type='User'左外部连接如下所示:ft on ft.User_id=users.id和ft.created_在<(users.created_在+间隔'1天')和ft.follower_type='Tag'左外部连接注释为c on c on c.User_id=users.id和c.created_在<(users.created_在+间隔'1天')由users.id组成的组(COUNT(distinct fu.id)>=3和COUNT(不同的ft.id)>=3和计数(不同的c.id)>=1)限制1“
你确定吗?如果用户是在10/30/2017 08:00创建的,user.created_+1天是10/31/2017 08:00
。如果评论是在10/30/2017 12:00创建的,那么我们将