Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.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/8/redis/2.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
如何基于具有多个关系的最旧元素的属性编写SQL查询?_Sql_Postgresql_Join_Greatest N Per Group - Fatal编程技术网

如何基于具有多个关系的最旧元素的属性编写SQL查询?

如何基于具有多个关系的最旧元素的属性编写SQL查询?,sql,postgresql,join,greatest-n-per-group,Sql,Postgresql,Join,Greatest N Per Group,给出以下示例数据模型/表: 为了简洁起见,在pseudo-Ruby/Rails中指定 这些表中的每个表都有一个唯一的“id”标识符字段,该字段是其主键,并且还存在一个连接订单和产品的联接表 我想选择所有用户,例如,他们最早的订单和最早的订单包含n个以上的产品 如何做到这一点 到目前为止,我一直在尝试:我尝试使用联接,但最终我们查看的是所有订单,而不是最旧的订单。我也尝试过使用DISTINCT/DISTINCT ON,但我不知道如何将其与a选择用户和b检查所有相关产品的数量正确结合起来 我正在使用

给出以下示例数据模型/表: 为了简洁起见,在pseudo-Ruby/Rails中指定

这些表中的每个表都有一个唯一的“id”标识符字段,该字段是其主键,并且还存在一个连接订单和产品的联接表

我想选择所有用户,例如,他们最早的订单和最早的订单包含n个以上的产品

如何做到这一点

到目前为止,我一直在尝试:我尝试使用联接,但最终我们查看的是所有订单,而不是最旧的订单。我也尝试过使用DISTINCT/DISTINCT ON,但我不知道如何将其与a选择用户和b检查所有相关产品的数量正确结合起来


我正在使用Postgres,但如果存在与DB无关的SQL答案,那也将非常感谢。

在Postgres中,我将使用distinct on来表达这一点。其基本思想是:

select o.*
from (select distinct on (o.user_id) o.user_id, o.order_id, o.ordered_at, count(*) as num_products
      from orders o join
           orderproducts op
           on op.order_id = o.order_id
      group by o.user_id, o.order_id, o.ordered_at
      order by o.user_id, o.ordered_at asc
     ) o
where num_products >= n

如果你问了一个关于SQL的问题,那么如果SQL的人能够理解这个问题,这会有所帮助。而且并非所有人都会说伪Ruby/Rails。因此,请将其转换为创建表语句。还可以将一些示例数据作为INSERT添加到语句中,并使用表格文本形式的示例数据获得所需的结果。显然,这是一个常见问题解答。在考虑发帖之前,请始终用谷歌搜索任何错误消息,以及你的问题/问题/目标的许多清晰、简洁和准确的措辞,包括和不包括你的特定字符串/名称;阅读许多答案。如果你发布一个问题,用一句话作为标题。请参见文本上方的投票箭头(&S)。请在代码问题中给出一个-cut&paste&runnable代码;示例输入,具有预期和实际输出,包括逐字错误消息;清晰的说明和解释。PS甚至还有一个标签,用于回答与此常见问题有关的问题。可能重复我刚刚发现的重复链接Google'site:stackoverflow.com sql select all users,例如他们最早的订单'。这甚至不清楚,它只是从您的消息中剪切和粘贴的,但即使使用特定的business&DB字符串,它也已经足够清楚了。不清楚您的表在Postgres中的实际外观。
class Order
  has_and_belongs_to_many :products
  ordered_at :timestamp
end
class Product
  name :string
  price :decimal
end
select o.*
from (select distinct on (o.user_id) o.user_id, o.order_id, o.ordered_at, count(*) as num_products
      from orders o join
           orderproducts op
           on op.order_id = o.order_id
      group by o.user_id, o.order_id, o.ordered_at
      order by o.user_id, o.ordered_at asc
     ) o
where num_products >= n