Oracle - SELECT DENSE_RANK OVER(ORDER BY、SUM、OVER 和 PARTITION BY)
Posted
技术标签:
【中文标题】Oracle - SELECT DENSE_RANK OVER(ORDER BY、SUM、OVER 和 PARTITION BY)【英文标题】:Oracle - SELECT DENSE_RANK OVER (ORDER BY, SUM, OVER and PARTITION BY) 【发布时间】:2019-07-02 15:08:00 【问题描述】:我有一个数据库,我可以在其中获取批次、缺陷和数量(来自 2 个表)。
稍微更改名称并删除一些我确定对问题不重要的过滤器后,我当前的工作查询如下所示(在this answer 的帮助下):
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
我正在尝试进一步改进查询,我得到了this solution 来优化它,这是我所需要的,但是在结合两个答案时出现错误。
在我看来,解决方案应该是以下查询:
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 '('.
(已翻译)。
当我从查询中删除 SELECT DENSE_RANK() OVER(ORDER BY ...)
中的 Sum(Sum(tbl1.qtd)) OVER (PARTITION BY tbl2.lot) DESC,
部分时,它运行并工作,但它没有按照我需要的方式对值进行排序。
我不确定问题是否可能出在另一个 OVER
内。我试图通过更换零件来弄清楚会发生什么,但找不到解决方案。
【问题讨论】:
【参考方案1】:经过大量尝试,我仍然没有弄清楚是否可以修复 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
。
【讨论】:
以上是关于Oracle - SELECT DENSE_RANK OVER(ORDER BY、SUM、OVER 和 PARTITION BY)的主要内容,如果未能解决你的问题,请参考以下文章
Oracle 中的 oracle cursor(select ..) 查询的目的是啥?
oracle 中select /* */ from table语法
怎么oracle 数据库怎么赋予select any directory 权限