簡體   English   中英

在PostgreSQL中使用不同的,然后使用聚合函數?

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

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