0

我正在创建一个报告,显示员工的前团队以及他们离开的日期,并汇总到报告中的单个字段中。这在一定程度上有效:

WITH "most_recent_leave_dates" AS (
    SELECT
        staff_id, -- alphanumeric string
        team,
        MAX(date_left) AS "most_recent_date_left"
    FROM team_membership
    WHERE date_left IS NOT NULL
    GROUP BY staff_id, team
    -- I thought ordering this CTE would do it, but no
    ORDER BY staff_id, most_recent_date_left DESC
)
SELECT
    staff_id,
    STRING_AGG(
        DISTINCT CONCAT(team, ' until ' || most_recent_date_left),
        CHR(10) -- separate by newline
    ) AS "teams"
FROM most_recent_leave_dates
GROUP BY staff_id

https://www.db-fiddle.com/f/jZCcKRWNV8vLJUFsa6kq7/2

但是STRING_AGG按字母顺序对术语进行排序。我希望它们按most_recent_date_left. 我怎样才能做到这一点?

文档指出:

或者,从排序的子查询中提供输入值通常会起作用。

我是否必须将 CTE 重写为子查询……?

4

2 回答 2

3

ORDER BYCTE 中是没有意义的。您可以ORDER BY作为以下内容的一部分STRING_AGG()

SELECT staff_id,
       STRING_AGG(CONCAT(team, ' until ' || most_recent_date_left),
                  CHR(10)
                  ORDER BY most_recent_date_left DESC
                 ) AS "teams"
FROM most_recent_leave_dates
GROUP BY staff_id;
于 2021-03-09T17:41:20.103 回答
1

只需从外部查询中删除,如下所示(我认为您不需要这个)。您的数据在 cte 中已按 staffid 和 most_recent_date_left 排序。

架构(PostgreSQL v9.6)

CREATE TABLE "team_membership" (
  staff_id text,
  team text,
  date_left date
);


INSERT INTO team_membership VALUES
('aaaa', 'B team', '2019-01-01'),
('aaaa', 'A team', '2021-01-01'),
('aaaa', 'C team', '2020-01-01'),
('aaaa', 'A team', '2018-01-01');

查询 #1

WITH "most_recent_leave_dates" AS (
    SELECT
        staff_id, 
        team,
        MAX(date_left) AS "most_recent_date_left"
    FROM team_membership
    WHERE date_left IS NOT NULL
    GROUP BY staff_id, team              
)
SELECT
    staff_id,
    STRING_AGG(
         CONCAT(team, ' until ' || most_recent_date_left),
        CHR(10) order by most_recent_date_left  desc
    ) AS "teams"
FROM most_recent_leave_dates
GROUP BY staff_id;
员工编号 团队
啊啊啊 A 组至 2021-01-01 C 组至 2020-01-01 B 组至 2019-01-01

在 DB Fiddle 上查看

于 2021-03-09T18:04:57.333 回答