[英]Using distinct and then an aggregate function in Postgresql?
這是一個非常基本的問題,無論出於何種原因,我都找不到合理的解決方案。 我會盡力解釋。
假設您有活動門票(區,行,座位號)。 每張票都屬於一個與會者。 多個票證可以屬於同一參與者。 每個參與者都有一個價值(例如:#1參與者價值10,000美元)。 就是說,這是我想做的:
1. Group the tickets by their section
2. Get number of tickets (count)
3. Get total worth of the attendees in that section
這就是我遇到的問題:如果1號與會者的價值10,000美元,並使用4張票,sum(attendees.worth)的回報為40,000美元。 這不准確。 價值應為10,000美元。 但是,當我在與會者上區分結果時,計數是不准確的。 在理想的世界中,最好做些類似的事情
select
tickets.section,
count(tickets.*) as count,
sum(DISTINCT ON (attendees.id) attendees.worth) as total_worth
from
tickets
INNER JOIN
attendees ON attendees.id = tickets.attendee_id
GROUP BY tickets.section
顯然,此查詢不起作用。 如何在單個查詢中完成同一件事? 甚至有可能嗎? 我也希望遠離子查詢,因為這是更大的解決方案的一部分,在該解決方案中,我需要跨多個表執行此操作。
另外,價值應該跟隨入場券平均分配。 例如:$ 10,000 /4。每張門票的參與者價值$ 5,000。 因此,如果門票位於不同的部分,則按比例分配價值。
謝謝你的幫助。
您需要在與會者之前匯總票證:
select ta.section, sum(ta.numtickets) as count, sum(a.worth) as total_worth
from (select attendee_id, section, count(*) as numtickets
from tickets
group by attendee_id, section
) ta INNER JOIN
attendees a
ON a.id = ta.attendee_id
GROUP BY ta.section
您仍然遇到一個問題,即單個與會者在多個部分中都有座位。 但是,您沒有指定解決方法(分配價值嗎?隨機選擇一個部分?將其歸於所有部分?可以正常選擇一個部分?)
使用jsonb_object_agg:
select
tickets.section,
count(tickets.*) as count,
(
SELECT SUM(value::int4)
FROM jsonb_each_text(jsonb_object_agg(attendees.id, attendees.worth))
) as total_worth
from
tickets
INNER JOIN
attendees ON attendees.id = tickets.attendee_id
GROUP BY tickets.section
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.