给定以下示例datamodels/表:(在伪卢比/铁轨中指定出于简洁的缘故(
class User
has_many :orders
end
class Order
has_and_belongs_to_many :products
ordered_at :timestamp
end
class Product
name :string
price :decimal
end
(这些表中的每一个都有一个唯一的" ID"标识符字段,该字段是其主要键,并且连接Order
和Product
的表也存在(
我想选择所有用户,例如他们的最古老的顺序(最早的ordered_at
(包含超过 n 产品。
如何完成?
到目前为止,我尝试过的是:我尝试使用JOIN
,但随后我们最终会查看 all 订单,而不仅仅是最古老的订单。我还尝试使用DISTINCT
/DISTINCT ON
,但我不知道如何将其与(a(选择用户正确组合以及(b(对所有相关产品的计数进行检查。
我正在使用Postgres,但是如果存在DB-Agnostic 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