2016-10-28 9 views
0

Я пытаюсь выполнить SQL-запрос, который требует группировки по MAX вычисления SUM (в PostgreSQL).SQL MAX SUM без подзапроса

Я нашел здесь несколько решений, которые используют суб-запрос, но мне нужно решение без него (если это возможно).

Запрос:

SELECT "Festival".title, 
     "Musician".aname, 
     SUM("Musician".salary * "Musician".percentage/100) AS "agent_total_profit" 
FROM "Festival" 
INNER JOIN "Booked" 
    ON "Booked".title = "Festival".title 
INNER JOIN "Musician" 
    ON "Musician".id = "Booked".id 
GROUP BY "Festival".title, 
     "Musician".aname 
ORDER BY "Festival".title 

Результат:

unwanted result of the query above

результат не как ожидалось, я хочу, чтобы найти для каждого названия фестиваля, музыканта aname с макс agent_total_profit.

Желаемый результат:

enter image description here

Спасибо заранее.

+0

для раздела требований по будет полезным образец см http://stackoverflow.com/questions/6198320/ how-to-use-partition-by-or-max –

+0

Почему нет подзапроса? – Hogan

ответ

2

Использование DISTINCT ON:

SELECT DISTINCT ON (f.title) f.title, m.aname, 
     SUM(m.salary * m.percentage/100) AS "agent_total_profit" 
FROM "Festival" f INNER JOIN 
    "Booked" b 
    ON b.title = f.title INNER JOIN 
    "Musician" m 
    ON m.id = b.id 
GROUP BY f.title, m.aname 
ORDER BY f.title, "agent_total_profit" DESC; 

Более традиционный метод SQL использует row_number():

SELECT f.* 
FROM (SELECT f.title, m.aname, 
      SUM(m.salary * m.percentage/100) AS "agent_total_profit", 
      ROW_NUMBER() OVER (PARTITION BY f.title ORDER BY SUM(m.salary * m.percentage/100) DESC) as seqnum 
     FROM "Festival" f INNER JOIN 
      "Booked" b 
      ON b.title = f.title INNER JOIN 
      "Musician" m 
      ON m.id = b.id 
     GROUP BY f.title, m.aname 
    ) f 
WHERE seqnum = 1; 
ORDER BY f.title, "agent_total_profit" DESC; 
+4

Анонимные downvotes являются грубыми. –

+0

Первый работал. благодаря! –

Смежные вопросы