Represent an OVER clause. This is a special operator against a so-called "window" function, as well as any aggregate function, which produces results relative to the result set itself. Most modern SQL backends now support window functions.
| 4221 | |
| 4222 | |
| 4223 | class Over(ColumnElement[_T]): |
| 4224 | """Represent an OVER clause. |
| 4225 | |
| 4226 | This is a special operator against a so-called |
| 4227 | "window" function, as well as any aggregate function, |
| 4228 | which produces results relative to the result set |
| 4229 | itself. Most modern SQL backends now support window functions. |
| 4230 | |
| 4231 | """ |
| 4232 | |
| 4233 | __visit_name__ = "over" |
| 4234 | |
| 4235 | _traverse_internals: _TraverseInternalsType = [ |
| 4236 | ("element", InternalTraversal.dp_clauseelement), |
| 4237 | ("order_by", InternalTraversal.dp_clauseelement), |
| 4238 | ("partition_by", InternalTraversal.dp_clauseelement), |
| 4239 | ("range_", InternalTraversal.dp_plain_obj), |
| 4240 | ("rows", InternalTraversal.dp_plain_obj), |
| 4241 | ("groups", InternalTraversal.dp_plain_obj), |
| 4242 | ] |
| 4243 | |
| 4244 | order_by: Optional[ClauseList] = None |
| 4245 | partition_by: Optional[ClauseList] = None |
| 4246 | |
| 4247 | element: ColumnElement[_T] |
| 4248 | """The underlying expression object to which this :class:`.Over` |
| 4249 | object refers.""" |
| 4250 | |
| 4251 | range_: Optional[typing_Tuple[_IntOrRange, _IntOrRange]] |
| 4252 | rows: Optional[typing_Tuple[_IntOrRange, _IntOrRange]] |
| 4253 | groups: Optional[typing_Tuple[_IntOrRange, _IntOrRange]] |
| 4254 | |
| 4255 | def __init__( |
| 4256 | self, |
| 4257 | element: ColumnElement[_T], |
| 4258 | partition_by: Optional[_ByArgument] = None, |
| 4259 | order_by: Optional[_ByArgument] = None, |
| 4260 | range_: Optional[typing_Tuple[Optional[int], Optional[int]]] = None, |
| 4261 | rows: Optional[typing_Tuple[Optional[int], Optional[int]]] = None, |
| 4262 | groups: Optional[typing_Tuple[Optional[int], Optional[int]]] = None, |
| 4263 | ): |
| 4264 | self.element = element |
| 4265 | if order_by is not None: |
| 4266 | self.order_by = ClauseList( |
| 4267 | *util.to_list(order_by), _literal_as_text_role=roles.ByOfRole |
| 4268 | ) |
| 4269 | if partition_by is not None: |
| 4270 | self.partition_by = ClauseList( |
| 4271 | *util.to_list(partition_by), |
| 4272 | _literal_as_text_role=roles.ByOfRole, |
| 4273 | ) |
| 4274 | |
| 4275 | if sum(bool(item) for item in (range_, rows, groups)) > 1: |
| 4276 | raise exc.ArgumentError( |
| 4277 | "only one of 'rows', 'range_', or 'groups' may be provided" |
| 4278 | ) |
| 4279 | else: |
| 4280 | self.range_ = self._interpret_range(range_) if range_ else None |