簡體   English   中英

運行聚合時如何在 group-by 中獲取不同的文本值?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM