Postgresql 作为聚合或窗口函数的一部分,计算多行中的值

Postgresql 作为聚合或窗口函数的一部分,计算多行中的值,postgresql,aggregate-functions,Postgresql,Aggregate Functions,我需要找到一种方法来判断一个列在一个分组/分区的节中是否有两个特定的值。最容易用例子来描述。我的表“foo”包含以下数据: ID | Indicator 1 | A 1 | B 1 | B 2 | C 2 | B 3 | A 3 | B 3 | B 3 | C 4 | A 4 | C 对于我的输出,如果组中的一行有指示符“a”,我希望结果为“a”。如果不是,则如果其中一行指示符为“C”,则为“C”。但是,如果该组的指标为“A”和“C”,我希望该组的结果为“X”。根据这些数

我需要找到一种方法来判断一个列在一个分组/分区的节中是否有两个特定的值。最容易用例子来描述。我的表“foo”包含以下数据:

ID | Indicator
1  | A
1  | B
1  | B
2  | C
2  | B
3  | A
3  | B
3  | B
3  | C
4  | A
4  | C
对于我的输出,如果组中的一行有指示符“a”,我希望结果为“a”。如果不是,则如果其中一行指示符为“C”,则为“C”。但是,如果该组的指标为“A”和“C”,我希望该组的结果为“X”。根据这些数据,我希望得到以下结果:

ID | Result
1  | A
2  | C
3  | X
4  | X
A或C(示例中的ID 1和2)的结果可以通过以下方式使用分区和windows函数完成:

SELECT DISTINCT ID,
                priority_indicator
  FROM (SELECT ID,
               first_value(Indicator) OVER
               (PARTITION BY ID
                    ORDER BY
                      CASE
                        WHEN Indicator = 'A' THEN
                          1
                        WHEN Indicator = 'C' THEN
                          2
                        ELSE
                          3
                      END
               ) priority_indicator
          FROM foo) a
当指示器中同时有“A”和“C”时,如何一次查看多行中的值以返回“X”

--test data
WITH foo(id,indicator) AS ( VALUES
  (1,'A'),
  (1,'B'),
  (1,'B'),
  (2,'C'),
  (2,'B'),
  (3,'A'),
  (3,'B'),
  (3,'B'),
  (3,'C'),
  (4,'A'),
  (4,'C')
), 
-- get all entries for each Id in indicator_set
agg AS (
  SELECT id,array_agg(DISTINCT(indicator)) AS indicator_set FROM foo
  GROUP BY id
)
-- actual query
SELECT id,
  CASE
    WHEN indicator_set @> '{A,C}' THEN 'X'
    WHEN indicator_set @> '{A}' THEN 'A'
    WHEN indicator_set @> '{C}' THEN 'C'
  END result
FROM agg;
输出:

 id | result 
----+--------
  1 | A
  2 | C
  3 | X
  4 | X
(4 rows)
输出:

 id | result 
----+--------
  1 | A
  2 | C
  3 | X
  4 | X
(4 rows)