Исключить несколько строк из основного запроса - PullRequest
0 голосов
/ 14 февраля 2020

Я хочу исключить две максимальные учетные записи из моего запроса в каждой компании за каждый год, я пишу запрос в pl- SQL, но он очень медленный, как я могу переписать его, чтобы он работал лучше?

Моя основная таблица содержит 9195771 строк.

Я ценю, если кто-нибудь может мне помочь

SELECT  
    g."COMPANY", g."ACCOUNTING_YEAR", SUM(g."AMOUNT")
FROM
    accounting_attribute_con a
INNER JOIN
    dana_gl_hold_vou_row_qry_dash g ON a.code_part_value = g."ACCOUNT" 
                                    AND g."COMPANY" = a.company
WHERE
    g."ACCOUNTING_YEAR" IN ('2019', '2018')
    AND g."COMPANY" IN ('DB','DD','DC','DG','DP','DO' )
    AND accounting_attribute_value_api.get_desc(a.company, attribute, ATTRIBUTE_VALUE) = 'others'
    AND g."ACCOUNTING_PERIOD" <> '13'
    AND g."ACCOUNTING_YEAR"||g."COMPANY"||g."ACCOUNT" NOT IN (SELECT FROM (SELECT SUM(g."AMOUNT"), g."ACCOUNTING_YEAR" acc_year, g."COMPANY" company, g."ACCOUNT_DESC", g."ACCOUNT" acc, RANK() OVER (partition by g."ACCOUNTING_YEAR", g."COMPANY"  ORDER BY SUM(g."AMOUNT") DESC) AS rnknumber
                                  FROM accounting_attribute_con a
                                  INNER JOIN dana_gl_hold_vou_row_qry_dash g ON a.code_part_value = g."ACCOUNT" AND g."COMPANY" = a.company
                                  WHERE g."ACCOUNTING_YEAR" IN ('2019', '2018')
                                    AND g."COMPANY" IN ('DB','DD','DE','DG','DP','DO' )
                                    AND accounting_attribute_value_api.get_desc(a.company, attribute, ATTRIBUTE_VALUE) = 'others'
                                    AND g."ACCOUNTING_PERIOD" <> '13'
                                  GROUP BY g."ACCOUNTING_YEAR" , g."COMPANY"  , g."ACCOUNT_DESC" , g."ACCOUNT") b
               WHERE 
                   rnknumber <= 2) 
GROUP BY
    g."COMPANY", g."ACCOUNTING_YEAR"

1 Ответ

0 голосов
/ 10 марта 2020

Если вы можете определить максимальное количество учетных записей в запросе, вы можете использовать оператор MINUS, чтобы исключить эти записи из основного запроса.

...