Oracle - ВЫБЕРИТЕ DENSE_RANK OVER (ORDER BY, SUM, OVER и PARTITION BY) - PullRequest
0 голосов
/ 02 июля 2019

У меня есть база данных, в которой я получаю лоты, дефекты и количества (из 2 таблиц).

После небольшого изменения имен и удаления некоторых фильтров, которые, как я убедился, были не важны для вопроса, мой текущийрабочий запрос выглядит следующим образом (с помощью этот ответ ):

WITH subquery AS (
  SELECT * FROM (
    SELECT tbl2.lot
    FROM db.tbl1 tbl1, db.tbl2 tbl2
    WHERE tbl2.key = tbl1.key
    GROUP BY tbl2.lot
    ORDER BY Sum(tbl1.qtd) DESC, tbl2.lot
  ) WHERE ROWNUM <= 10
) SELECT tbl2.lot, tbl1.defect, tbl1.desc, Sum(tbl1.qtd)
FROM db.tbl1 tbl1, db.tbl2 tbl2, subquery
WHERE tbl2.lot = subquery.lot
  AND tbl2.key = tbl1.key
GROUP BY tbl2.lot, tbl1.defect, tbl1.desc
ORDER BY Sum(Sum(tbl1.qtd)) OVER (PARTITION BY tbl2.lot) DESC, Sum(tbl1.qtd) DESC, tbl2.lot, tbl1.defect, tbl1.desc

Я пытаюсь улучшить запрос немного больше, и я получил это решение , чтобы оптимизировать его, это то, что мне было нужно, но я получаю сообщение об ошибке при объединении обоих ответов.

В моей голове должен быть следующий запрос:

SELECT *
FROM (
  SELECT DENSE_RANK() OVER (ORDER BY Sum(Sum(tbl1.qtd)) OVER (PARTITION BY tbl2.lot) DESC, Sum(tbl1.qtd) DESC, tbl2.lot, tbl1.defect, tbl1.desc) rnk, tbl2.lot, tbl1.defect, tbl1.desc, Sum(tbl1.qtd)
  FROM db.tbl1 tbl1, db.tbl2 tbl2
  WHERE tbl2.key = tbl1.key
  GROUP BY tbl2.lot, tbl1.defect, tbl1.desc
  ORDER BY Sum(Sum(tbl1.qtd)) OVER (PARTITION BY tbl2.lot) DESC, Sum(tbl1.qtd) DESC, tbl2.lot, tbl1.defect, tbl1.desc
)
WHERE rnk <= 10
ORDER BY rnk

Но яполучить ошибку It was not possible to add the table '('. (переведено).

Когда я удаляю деталь Sum(Sum(tbl1.qtd)) OVER (PARTITION BY tbl2.lot) DESC, внутри SELECT DENSE_RANK() OVER(ORDER BY ...) из запроса, который он выполняет и работает, за исключением того, что он не упорядочивает значения так, как мне нужно.

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

1 Ответ

0 голосов
/ 03 июля 2019

После долгих попыток я все еще не понял, возможно ли исправить порядок внутри DENSE_RANK() OVER, но я нашел решение между ними.

SELECT lot, def, qtd
FROM (
  SELECT DENSE_RANK() OVER (ORDER BY qtd_lot DESC) rnk, lot, def, qtd
  FROM (
    SELECT tbl2.lot lot, tbl1.def def, Sum(tbl1.qtd) qtd, Sum(Sum(tbl1.qtd)) OVER (PARTITION BY tbl2.lot) qtd_lot
    FROM db.tbl1 tbl1, db.tbl2 tbl2
    WHERE tbl2.key = tbl1.key
    GROUP BY tbl2.lot, tbl1.def
  )
)
WHERE rnk <= 10
ORDER BY rnk, qtd DESC, lot, def

Это не так хорошо, как решение, которое я пробовал, но оно лучше, чем мой предыдущий рабочий код.Я переместил Sum(Sum(tbl1.qtd)) OVER (PARTITION BY tbl2.lot) из DENSE_RANK(), а затем добавил его с именем qtd_lot.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...