为客户购买的第一件商品加入时间戳为 YEAR 的 2 个表
Joining 2 tables with a timestamp of YEAR for the first item purchased by customer
我有 2 table 个“项目”和“客户”。
在两个 table 中,都存在“customer_id”并且单个客户可以拥有超过 1 件商品。在“项目”table 中,还有一个名为“date_created”的时间戳字段,用于购买项目。
我想构建一个查询,可以 return 每个 customer_id 和 item_id 与每个客户在特定年份购买的第一件商品相关联,比如说 2020 年。
我的方法是
SELECT customer_id, items
INNER JOIN items ON items.customer_id=customers.customer_id
然后尝试使用 EXTRACT 函数处理每个客户在 2020 年购买的第一件商品,但我似乎无法仅提取特定年份的第一件商品。我真的很感激一些帮助。
我正在使用 PostgreSQL。谢谢。
只需使用distinct on
:
select distinct on (customer_id) i.*
from items i
where date_created >= date '2020-01-01' and
date_created < date '2021-01-01'
order by customer_id, date_created;
首先,请注意直接日期比较的使用。这使得优化器更容易选择最佳执行计划。
distinct on
是一个方便的 Postgres 扩展,returns 第一行遇到的括号中的键必须是 order by
中的第一个键。 “第一个”是基于随后的 order by
个键。
我有 2 table 个“项目”和“客户”。
在两个 table 中,都存在“customer_id”并且单个客户可以拥有超过 1 件商品。在“项目”table 中,还有一个名为“date_created”的时间戳字段,用于购买项目。
我想构建一个查询,可以 return 每个 customer_id 和 item_id 与每个客户在特定年份购买的第一件商品相关联,比如说 2020 年。
我的方法是
SELECT customer_id, items
INNER JOIN items ON items.customer_id=customers.customer_id
然后尝试使用 EXTRACT 函数处理每个客户在 2020 年购买的第一件商品,但我似乎无法仅提取特定年份的第一件商品。我真的很感激一些帮助。 我正在使用 PostgreSQL。谢谢。
只需使用distinct on
:
select distinct on (customer_id) i.*
from items i
where date_created >= date '2020-01-01' and
date_created < date '2021-01-01'
order by customer_id, date_created;
首先,请注意直接日期比较的使用。这使得优化器更容易选择最佳执行计划。
distinct on
是一个方便的 Postgres 扩展,returns 第一行遇到的括号中的键必须是 order by
中的第一个键。 “第一个”是基于随后的 order by
个键。