Postgresql 作为聚合或窗口函数的一部分,计算多行中的值
我需要找到一种方法来判断一个列在一个分组/分区的节中是否有两个特定的值。最容易用例子来描述。我的表“foo”包含以下数据: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”。根据这些数
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)