当前位置: 首页 > 面试题库 >

布尔列上的SQLAlchemy func.count

都才俊
2023-03-14
问题内容

如何轻松计算特定列所在的行数和特定列所在的行truefalse

我无法(或可以?)运行带有count()的查询,因为我将此计数嵌入到了having()子句中,例如:

.having(func.count(Question.accepted) >
        func.count(not_(Question.accepted)))

但是通过上述方法,该函数计算了不等式两侧的每一行。

我尝试过这样的事情

.having(func.count(func.if_(Question.accepted, 1, 0)) >
        func.count(func.if_(Question.accepted, 0, 1)))

但我得到一个错误

函数if(布尔值,整数,整数)不存在

(似乎它在postgresql中不存在)。

如何轻松计算column为true和false的行数?


问题答案:

HAVING子句中使用聚合函数非常合法,因为它可以HAVING消除组行。条件计数可以通过使用NULL不计数的属性来实现:

count(expression) …表达式值不为null的输入行数

或者,如果使用PostgreSQL
9.4或更高版本
,则带有aggregateFILTER子句:

count(*) FILTER (WHERE something > 0)

您还可以使用一个总和(和零)。

PostgreSQL> = 9.4和SQLAlchemy> = 1.0.0

使用过滤的聚合函数:

.having(func.count(1).filter(Question.accepted) >
        func.count(1).filter(not_(Question.accepted)))

较旧的PostgreSQL和/或SQLAlchemy


if”的SQL模拟是CASE表达式或在这种情况下的nullif()函数。两者都可以与NULLs不算在内的事实一起使用:

from sqlalchemy import case

...

.having(func.count(case([(Question.accepted, 1)])) >
        func.count(case([(not_(Question.accepted), 1)])))

要么:

.having(func.count(func.nullif(Question.accepted, False)) >
        func.count(func.nullif(Question.accepted, True)))

使用nullif()可有点混乱的“条件”是什么,你
希望计数。您可以使用使条件更自然的表达式,但这留给读者。这两个是更可移植的解决方案,但另一方面,该FILTER条款是标准的,尽管并未广泛使用。



 类似资料:
  • 出于某种原因,我得到了这个布尔值的空对象引用,我不知道为什么。我不明白为什么布尔值返回空对象引用 这是活动代码 这是发生在第101行和第75行的完整错误日志

  • 我正在尝试编译和部署neo4j-connector。 neo4j-connector-impl中的两个类(和)具有以下注释: 我可以想出一些方法(例如,添加一个方法),但这感觉不对:这段代码自一年前提交以来一直未变,所以为什么它不适合我呢?这里可能出了什么问题?

  • 问题内容: 快速提问: 在JSONNet中-如何获取布尔true / false以序列化为布尔1/0 我可以看到我们如何处理空值,而所有这些似乎都找不到如何执行此操作。 这可能吗? 问题答案: 您可以像这样实现自定义转换器:

  • 问题内容: 这可能只是白痴,但对我来说有点混乱: 为什么在返回时返回? 问题答案: 您正在根据布尔值的文字值检查它。一样不会是真的。 如果将其投射,您将看到区别: 究其原因是真实的,因为你是比较相同的对象。与或相同。 当您看到类似的东西并且此检查从未通过时,困难就来了。那是因为您正在检查项目的 真实值 。按照惯例,所有这些项目都将通过布尔检查失败- 也就是说,它们的布尔值将为: (明显) 任何空序

  • 问题内容: 尽管至少有两个 关于如何在Python的库中为DataFrame编制索引的优秀教程,但我仍然无法找到一种优雅的方法来编写多个列。 我已经发现(我认为是)这样一种不太优雅的方式 但这并不漂亮,可读性得分很低(我认为)。 有没有更好,更Python风格的方法? 问题答案: 这是一个优先运算符问题。 您应该添加额外的括号以使多条件测试正常工作: 您提到的教程的这一部分显示了带有几个布尔条件的

  • 问题内容: 我如何聚合这样的一些元组 与OR函数并返回下表? 问题答案: 只需执行一次,使用即可返回T(如果有),否则返回F。