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缺少into?

oracle 中select /* */ from table语法

怎么oracle 数据库怎么赋予select any directory 权限

oracle 中 select中嵌套select语法,该怎么处理

oracle分页查询,一个select语句解决,不需要子查询。