有条件操作的django聚合函数(即生成sql'case when'语句)

django-conditional-aggregates的Python项目详细描述


Build StatusLatest PyPI version

Python 2.7

Django 1.6Django 1.7

(由于旧的“sqlcompiler”类的限制,django 1.4和1.5不可能)

注:本模块不需要Django 1.8版本,因为支持是内置的: https://docs.djangoproject.com/en/1.8/ref/models/conditional-expressions/#case

有时需要一些条件逻辑来决定要在聚合函数中“聚合”哪些相关行。

在sql中,可以使用CASE子句来完成此操作,例如:

SELECTstats_stat.campaign_id,SUM(CASEWHEN(stats_stat.stat_type=aANDstats_stat.event_type=v)THENstats_stat.countELSE0END)ASimpressionsFROMstats_statGROUPBYstats_stat.campaign_id

注意,这与使用django的普通.filter(...).aggregate(Sum(...))不同……我们所做的实际上是在orm的Sum(...)部分中。

我相信这些“条件聚合”在进行GROUP BY类型的查询时最有用(也许only)-它们允许您精确地控制如何聚合组中的值,例如仅汇总与特定条件匹配的行。

用法:

pip install django-conditional-aggregates

fromdjango.db.modelsimportQfromdjconnaggimportConditionalSum# recreate the SQL example from above in pure Django ORM:report=(Stat.objects.values('campaign_id')# values + annotate => GROUP BY.annotate(impressions=ConditionalSum('count',when=Q(stat_type='a',event_type='v')),))

注意,标准djangoQ对象用于构造CASE WHEN(...)子句。就像在orm的其余部分中一样,您可以将它们与() | & ~运算符组合,以生成复杂的查询。

^提供了{tt9}$和ConditionalCount聚合函数。如果你需要自己的话,还有一个基类。ConditionalSum的实现非常简单,如下所示:

fromdjconnagg.aggregatesimportConditionalAggregate,SQLConditionalAggregateclassConditionalSum(ConditionalAggregate):name='ConditionalSum'classSQLClass(SQLConditionalAggregate):sql_function='SUM'default=0

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java不支持org。阿帕奇。平民数学3。分配二元分布(1,p)`会带来很多性能开销吗?   java Android开发人员新手无法在模拟器中启动代码   显示不同版本的java版本和javac版本   java在这种情况下如何使用Spring和Hibernate正确更新对象?   java改变了我整个安卓 studio应用程序的主题   java在LIBGDX中生成可执行Jar文件   mysql对sql结果进行排序,并在java中通过循环在表中显示所有结果   swing如何在java中的textArea中新添加的文本末尾自动显示插入符号?   java需要验证时间,但会不断遇到问题   java像字符串一样拆分“数组”   java Apache Camel:具有属性和属性占位符的RecipientList不起作用   java中的文件子目录和主目录监视   java这样使用Spring规范谓词安全吗?   带Eclipselink的java Oracle 12c标识列   java为什么我在socket inputstream中遇到奇怪的字符   java Hibernate+swing检查登录/密码   java Log4j如何仅禁用致命条目   会话失效后找到的java数据   MySql查询:如何使用MySql和java同时执行两个查询?