Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql查询以获取在帐户创建后24小时内具有一些属性的用户_Sql_Ruby On Rails_Postgresql_Datetime - Fatal编程技术网

Postgresql查询以获取在帐户创建后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

我正在尝试为Rails应用程序编写一个SQL查询,以获取在创建帐户后24小时内跟踪三个用户、跟踪三个标记并留下便条的用户数

模型结构为:

  • 用户模型在列中创建了一个ID和
    ,而用户
    有许多后续和注释
  • Follows模型有一个与用户id匹配的
    跟随者id
    ,一个
    跟随者类型
    ,它要么是
    “用户”
    ,要么是
    “标签”
    ,还有一个在
    创建的
  • 注释模型具有与用户id匹配的
    用户id
    ,以及在
    处创建的
自从我的SQL技能不高以来,我还没走多远。我得到的最接近的(仍然很遥远)是这样的:

 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创建的,那么我们将