Oracle SQL Count 或 Sum 以防查询?

托德K

我在 StackOverflow 上研究了五个不同的线程,我觉得我已经接近但仍然没有雪茄。我原来的表有几个section,每个section有几行,每一行有几个位置。我希望能够查询一个结果,其中列出了部分、行、位置、行中高于该行的位置数量(位置编号较低)以及行中低于该行的位置数量(位置编号较大)的结果。

这是我所拥有的:

SELECT section, 
       row, 
       position AS P, 
       SUM(case when position < P then 1 else 0 end) AS Above, 
       SUM(case when position > P then 1 else 0 end) AS Below 
FROM OriginalTable 
GROUP BY section, row, position 
ORDER BY section, row, position

总和情况未将 P 识别为位置,当我将 P 更改为数字时,总和相差甚远。

粘点

一种可能的解决方案是相关子查询获取count()部分和行的较低/较高位置。

SELECT ot1.section,
       ot1.row,
       ot1.position,
       (SELECT count(*)
               FROM originaltable ot2
               WHERE ot2.section = ot1.section
                     AND ot2.row = ot2.row
                     AND ot2.position > ot1.position) above,
       (SELECT count(*)
               FROM originaltable ot2
               WHERE ot2.section = ot1.section
                     AND ot2.row = ot2.row
                     AND ot2.position < ot1.position) below
      FROM originaltable ot1
      ORDER BY ot1.section,
               ot1.row,
               ot1.position;

另一种是使用窗口版本的count().

SELECT ot1.section,
       ot1.row,
       ot1.position,
       count(*) OVER (PARTITION BY ot1.section,
                                   ot1.row
                      ORDER BY ot1.position
                      RANGE BETWEEN CURRENT ROW
                                    AND UNBOUNDED FOLLOWING) - 1 above
       count(*) OVER (PARTITION BY ot1.section,
                                   ot1.row
                      ORDER BY ot1.position
                      RANGE BETWEEN UNBOUNDED PRECEDING
                                    AND CURRENT ROW) - 1 below
      FROM originaltable ot1
      ORDER BY ot1.section,
               ot1.row,
               ot1.position;

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章