如何在PostgreSQL中添加首单对应部门名称列
PostgreSQL 查询:添加用户在对应公司下首次销售的部门名称
需求是为每条销售记录添加first_division_name列,存储该用户在对应公司下首次销售对应的部门名称——即同一user_id+company组合中,最早sale_date对应的division_name,需填充到该组合的所有记录中。
方法一:使用窗口函数(最简洁)
利用FIRST_VALUE窗口函数直接计算每个分组的首次部门名称,无需额外关联:
SELECT user_id, company, division_name, sale, sale_date, FIRST_VALUE(division_name) OVER ( PARTITION BY user_id, company ORDER BY sale_date ASC ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING ) AS first_division_name FROM your_table_name;
PARTITION BY user_id, company:限定仅在同一用户+公司的范围内计算首次部门ORDER BY sale_date ASC:按销售日期升序排列,确保最早的记录排在分组首位ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING:让窗口覆盖分组内所有行,确保每条记录都能拿到分组的首个部门名称(默认窗口仅包含从开头到当前行的记录,需手动扩展范围)
方法二:先聚合再关联(兼容性更强)
如果需要兼容旧版PostgreSQL或更直观的逻辑,可以先找出每个用户+公司的最早销售日期,再关联获取对应的部门名称:
WITH first_sales AS ( -- 第一步:找出每个用户+公司的最早销售日期 SELECT user_id, company, MIN(sale_date) AS first_sale_date FROM your_table_name GROUP BY user_id, company ), first_division AS ( -- 第二步:根据最早日期获取对应的部门名称 SELECT fs.user_id, fs.company, t.division_name AS first_division_name FROM first_sales fs JOIN your_table_name t ON fs.user_id = t.user_id AND fs.company = t.company AND fs.first_sale_date = t.sale_date ) -- 第三步:关联原表,为每条记录添加上首次部门名称 SELECT t.*, fd.first_division_name FROM your_table_name t JOIN first_division fd ON t.user_id = fd.user_id AND t.company = fd.company;
示例输出
执行上述查询后,结果将与示例表格一致:
| user_id | company | division_name | sale | sale_date | first_division_name |
|---|---|---|---|---|---|
| 1 | red | name 1 | 100 | 01-01-2022 | name 1 |
| 1 | blue | name 2 | 150 | 03-02-2022 | name 1 |
| 2 | blue | name 3 | 100 | 10-05-2023 | name 3 |
| 1 | red | name 4 | 80 | 10-05-2023 | name 1 |
| 2 | white | name 1 | 100 | 12-06-2023 | name 3 |
| 3 | red | name 1 | 120 | 03-02-2022 | name 1 |
| 3 | red | name 1 | 60 | 03-03-2022 | name 1 |
内容的提问来源于stack exchange,提问作者Elena
相关产品推荐
相关产品推荐

