оконные функции оракула

Может ли кто-нибудь помочь мне с этим запросом:

SELECT SUM(summa), name, 
       TO_CHAR(invoice_date, 'YYYY/mm') 
           OVER (PARTITON EXTRACT(MONTH FROM i.invoice_date, c.name) 
FROM invoice i, customer c 
WHERE i.customer_id = c.id
AND months_between(sysdate, invoice_date) = 3
AND rownum < 11 GROUP BY invoice_date, name
ORDER BY SUM(SUMMA) DESC;

Предполагается получить первые десять строк за последние три месяца, сгруппированные по месяцам и отсортированные по сумме.

Спасибо.


person Novice    schedule 11.05.2015    source источник
comment
Неясно, с чем вы просите помощи... также может быть полезна демонстрация ваших данных, из которых вы запрашиваете.   -  person DrCord    schedule 11.05.2015
comment
У вас несоответствующие скобки, неверный синтаксис, ключевые слова с ошибками...   -  person Tony Andrews    schedule 11.05.2015
comment
Я не очень разбираюсь в оракуле, но OVER() применительно к неагрегату кажется неправильным.   -  person Hart CO    schedule 11.05.2015


Ответы (1)


Во-первых, используйте правильный явный синтаксис join. Во-вторых, вам нужно row_number():

SELECT t.*
FROM (SELECT SUM(summa) as sumsumma, name, 
             TO_CHAR(invoice_date, 'YYYY/mm') as yyyymm,
             ROW_NUMBER() OVER (PARTITION BY TO_CHAR(invoice_date, 'YYYY/mm')
                                ORDER BY SUM(summa) DESC
                               ) as seqnum
      FROM invoice i JOIN
           customer c 
           ON i.customer_id = c.id
      WHERE months_between(sysdate, invoice_date) = 3
      GROUP BY invoice_date, name
     ) t
WHERE seqnum <= 10
ORDER BY sumsumma DESC;
person Gordon Linoff    schedule 11.05.2015
comment
Большое спасибо, вы решили это быстрее, чем я мог сгенерировать тестовые данные. Если вас это не слишком беспокоит, может быть, вы могли бы объяснить, почему необходимо явное соединение? - person Novice; 11.05.2015
comment
@ Новичок . . . Явные соединения десятилетиями были частью стандарта ANSI и почти столько же времени поддерживались Oracle. Они более мощные, потому что могут эффективно выражать внешние соединения. Кроме того, большинству людей легче следовать явному синтаксису join. - person Gordon Linoff; 12.05.2015