[英]How do I get distinct text values in a group-by while running an aggregate?
我有以稍微奇怪的模式填充的數據,所以我必須做很多子查詢才能按照我喜歡的方式格式化數據。 它已經很難閱讀了,所以我想知道是否有任何我可以使用的 Postgres 函數,或者只是一種更好的查詢方法。
這里的相關數據在兩個表中:
observations
+--------+--------+-------------+
| obs_id | person | observed_at |
+--------+--------+-------------+
| 1a | John | 1/1/20 |
| 2b | Barry | 2/1/20 |
| 3c | John | 3/1/20 |
| 4d | Barry | 4/1/20 |
| 5e | John | 5/1/20 |
| 6f | Zach | 7/1/20 |
+--------+--------+-------------+
measurements
+--------+---------+-------+-------+
| obs_id | meas_id | score | arc |
+--------+---------+-------+-------+
| 1a | f32f | 1 | NULL |
| 1a | k8787 | NULL | NULL |
| 1a | 93j2 | NULL | ARC 1 |
| 1a | 0fkd | 2 | NULL |
| 2b | 92u4 | 4 | NULL |
| 2b | 10fl | NULL | ARC 1 |
| 2b | 42u4 | 3 | NULL |
| 3c | 70fl | NULL | ARC 1 |
| 3c | 70fl | 4 | NULL |
| 3c | 8f09 | 1 | NULL |
| 4d | 0987 | 4 | NULL |
| 4d | 0192 | 4 | NULL |
| 4d | 1234 | NULL | ARC 1 |
| 5e | 8d0s | NULL | ARC 2 |
| 5e | 1112 | 3 | NULL |
| 6f | 0981 | 1 | NULL |
| 6f | fdsf | 2 | NULL |
| 6f | jy4s | 3 | NULL |
| 6f | 876j | NULL | ARC 1 |
+--------+---------+-------+-------+
在英語中,輸出中的記錄應該是這樣:在每個弧中,對於每個人,計算最新觀察的分數。 因此,在輸出中,John 將有 2 條記錄(ARC 1 和 ARC 2 中的 1 行),Barry 將有 1 條記錄(ARC 1 中的 1 行),而 Zach 也將只有 1 條記錄(ARC 1 中的 1 行)。
用更多的技術術語來說,我希望輸出的粒度為person | arc | avg_score
person | arc | avg_score
person | arc | avg_score
。 我遇到問題的部分是在獲取avg(score)
並獲取arc
的同時對數據進行分組。 輸出應如下所示:
+--------+--------+-----------+
| person | arc | avg_score |
+--------+--------+-----------+
| John | ARC 1 | 2.5 |
| John | ARC 2 | 3 |
| Barry | ARC 1 | 4 |
| Zach | ARC 1 | 2 |
+--------+--------+-----------+
這是不正確的,但具有我正在嘗試做的一般要點。 這每人只能獲得 1 條記錄,但我希望每個弧線的輸出更細化。 我知道我可以再通過一次並再次獲得avg(score)
和min(arc)
,但我在此之上還有另外 2 個查詢,並希望最小化查詢數量。
SELECT
row_number() over (partition by person order by observed_at desc) as row_num,
*
FROM
(
SELECT
obs_id,
person,
observed_at,
avg(score),
max(arc)
FROM observations as o
INNER JOIN measurements as m
ON o.obs_id = m.obs_id
GROUP BY obs_id, person, observed_at
) a
這是很多關於如何減少桌子上傳遞次數的問題,但我必須做更多的子查詢,我能做的更少就是勝利。
你可以試試這樣的
with
t1l as (
select t1.*, t2.arc, ROW_NUMBER() over (partition by arc, person order by observed_at desc) n
from observations t1
left join measurements t2 on t1.obs_id = t2.obs_id
where arc is not null
)
select person, t1l.arc, avg(t2.score) avg_score
from t1l
join measurements t2 on t2.obs_id = t1l.obs_id
where n=1
group by person, t1l.arc
order by person, arc
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.