私が持っているようなクエリ:のようなものになりますpostgresqlでそのようなクエリを効果的に書く方法:連続した行を配列に集約する(列のペアで識別)?
(
SELECT
t1.person_id,
t1.created_at,
't1' AS type,
t1.extra_data AS extra_data
FROM table1 AS t1
)
UNION
(
SELECT
t2.person_id,
t2.created_at,
't2' AS type,
t2.extra_data AS extra_data
FROM table2 AS t2
)
UNION
(
SELECT
t3.person_id,
t3.created_at,
't3' AS type,
t3.extra_data AS extra_data
FROM table3 AS t3
)
ORDER BY created_at DESC;
(created_at
がタイムスタンプである、と私は具体的な値を省略し、順序を表すために、単純な整数を使用)
person_id | type | created_at | extra_data
--------- | ---- | ---------- | ----------
1 | t1 | 9 | a
1 | t1 | 8 | b
2 | t2 | 7 | c
2 | t2 | 6 | c
2 | t2 | 5 | d
1 | t3 | 4 | e
3 | t3 | 3 | f
私は最終的なcreated_atとして最大created_at
の連続した(person_id、type)の組をグループ化し、配列にextra_data
を集約したい、つまり、次の結果を得たいとします。
person_id | type | created_at | extra_data_array
--------- | ---- | ---------- | ----------
1 | t1 | 9 | [a, b]
2 | t2 | 7 | [c, c, d]
1 | t3 | 5 | e
3 | t3 | 4 | f
私は窓関数を試しましたが、これを達成する方法を理解することができませんでした。
私の質問は:
1)私の目標を達成するために、単一のクエリを記述するためにどのように?
2)このようなクエリは、index?
2番目の質問に対する私の懸念は、ベース結果がUNIONクエリから選択されるため、インデックスを利用する機会があるかどうかは疑問です。
誰でも、あらゆる種類の助けを借りて、誰でも!