123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108 |
- from django.db.models.expressions import Func
- from django.db.models.fields import FloatField, IntegerField
-
- __all__ = [
- 'CumeDist', 'DenseRank', 'FirstValue', 'Lag', 'LastValue', 'Lead',
- 'NthValue', 'Ntile', 'PercentRank', 'Rank', 'RowNumber',
- ]
-
-
- class CumeDist(Func):
- function = 'CUME_DIST'
- output_field = FloatField()
- window_compatible = True
-
-
- class DenseRank(Func):
- function = 'DENSE_RANK'
- output_field = IntegerField()
- window_compatible = True
-
-
- class FirstValue(Func):
- arity = 1
- function = 'FIRST_VALUE'
- window_compatible = True
-
-
- class LagLeadFunction(Func):
- window_compatible = True
-
- def __init__(self, expression, offset=1, default=None, **extra):
- if expression is None:
- raise ValueError(
- '%s requires a non-null source expression.' %
- self.__class__.__name__
- )
- if offset is None or offset <= 0:
- raise ValueError(
- '%s requires a positive integer for the offset.' %
- self.__class__.__name__
- )
- args = (expression, offset)
- if default is not None:
- args += (default,)
- super().__init__(*args, **extra)
-
- def _resolve_output_field(self):
- sources = self.get_source_expressions()
- return sources[0].output_field
-
-
- class Lag(LagLeadFunction):
- function = 'LAG'
-
-
- class LastValue(Func):
- arity = 1
- function = 'LAST_VALUE'
- window_compatible = True
-
-
- class Lead(LagLeadFunction):
- function = 'LEAD'
-
-
- class NthValue(Func):
- function = 'NTH_VALUE'
- window_compatible = True
-
- def __init__(self, expression, nth=1, **extra):
- if expression is None:
- raise ValueError('%s requires a non-null source expression.' % self.__class__.__name__)
- if nth is None or nth <= 0:
- raise ValueError('%s requires a positive integer as for nth.' % self.__class__.__name__)
- super().__init__(expression, nth, **extra)
-
- def _resolve_output_field(self):
- sources = self.get_source_expressions()
- return sources[0].output_field
-
-
- class Ntile(Func):
- function = 'NTILE'
- output_field = IntegerField()
- window_compatible = True
-
- def __init__(self, num_buckets=1, **extra):
- if num_buckets <= 0:
- raise ValueError('num_buckets must be greater than 0.')
- super().__init__(num_buckets, **extra)
-
-
- class PercentRank(Func):
- function = 'PERCENT_RANK'
- output_field = FloatField()
- window_compatible = True
-
-
- class Rank(Func):
- function = 'RANK'
- output_field = IntegerField()
- window_compatible = True
-
-
- class RowNumber(Func):
- function = 'ROW_NUMBER'
- output_field = IntegerField()
- window_compatible = True
|