PARTITION BY 1是什么意思?

时间:2010-07-26 19:48:16

标签: oracle count analytics database-partitioning

对于一对游标,其中在第一个FETCH之后立即需要结果集中的总行数(在一些试错之后),我想出了下面的查询

SELECT
 col_a,
 col_b,
 col_c,
 COUNT(*) OVER( PARTITION BY 1 ) AS rows_in_result
FROM 
 myTable JOIN theirTable ON
 myTable.col_a = theirTable.col_z
GROUP BY
 col_a, col_b, col_c
ORDER BY 
 col_b

现在,当查询的输出为X行时,rows_in_result会准确地反映这一点。

  • PARTITION BY 1是什么意思?
    • 认为它可能告诉数据库将结果分成每行1行

2 个答案:

答案 0 :(得分:9)

这是PARTITION BY的一个不寻常的用法。它的作用是将所有内容放在同一个分区中,这样如果查询一共返回123行,那么每行的rows_in_result值将为123(正如别名所暗示的那样)。

因此相当于更简洁:

COUNT(*) OVER ()

答案 1 :(得分:1)

数据库可以自由地为OVER()子句添加限制。有时,PARTITION BY [...]和/或ORDER BY [...]是强制条款,具体取决于聚合函数。 PARTITION BY 1可能只是用于语法完整性的伪子句。以下两个通常是等价的:

[aggregate function] OVER ()
[aggregate function] OVER (PARTITION BY 1)

但请注意,Sybase SQL Anywhere和CUBRID将此1解释为列索引引用,类似于ORDER BY [...]子句中可能的引用。这可能看起来有点令人惊讶,因为它对查询的投影强加了评估顺序。在您的情况下,此表示以下是等效的

COUNT(*) OVER (PARTITION BY 1)
COUNT(*) OVER (PARTITION BY col_a)

这种与其他数据库解释的奇怪偏差允许引用更复杂的分组表达式。