【问题标题】:SqlAlchemy: count of distinct over multiple columnsSqlAlchemy:多列的不同计数
【发布时间】:2013-05-19 16:43:38
【问题描述】:

我做不到:

>>> session.query(
        func.count(distinct(Hit.ip_address, Hit.user_agent)).first()
TypeError: distinct() takes exactly 1 argument (2 given)

我能做到:

session.query(
        func.count(distinct(func.concat(Hit.ip_address, Hit.user_agent))).first()

这很好(“pageload”数据库表中的唯一用户数)。

这在一般情况下是不正确的,例如将为下表提供 1 而不是 2 的计数:

 col_a | col_b
----------------
  xx   |  yy
  xxy  |  y

有什么方法可以生成下面的SQL(至少在postgresql中有效)?

SELECT count(distinct (col_a, col_b)) FROM my_table;

【问题讨论】:

    标签: postgresql count sqlalchemy distinct aggregate-functions


    【解决方案1】:

    distinct() 在附加到查询对象时接受多个参数:

    session.query(Hit).distinct(Hit.ip_address, Hit.user_agent).count()
    

    它应该生成如下内容:

    SELECT count(*) AS count_1
    FROM (SELECT DISTINCT ON (hit.ip_address, hit.user_agent)
    hit.ip_address AS hit_ip_address, hit.user_agent AS hit_user_agent
    FROM hit) AS anon_1
    

    这更接近你想要的。

    【讨论】:

    • 这也会在所有列上生成一个不同的选择,而不仅仅是作为参数添加的列。
    • 你不需要做查询(命中)。相反,您需要查询(Hit.ip_address, Hit.user_agent),然后SQLA会正确处理。
    【解决方案2】:

    可以使用tuple_() 构造生成确切的查询:

    session.query(
        func.count(distinct(tuple_(Hit.ip_address, Hit.user_agent)))).scalar()
    

    【讨论】:

      【解决方案3】:

      看起来 sqlalchemy distinct() 只接受一个列或表达式。

      另一种方法是使用group_bycount。这应该比使用两列的concat 更有效 - 如果索引确实存在,则按数据库分组将能够使用索引:

      session.query(Hit.ip_address, Hit.user_agent).\
          group_by(Hit.ip_address, Hit.user_agent).count()
      

      生成的查询看起来仍然与您询问的内容不同:

      SELECT count(*) AS count_1 
      FROM (SELECT hittable.user_agent AS hittableuser_agent, hittable.ip_address AS sometable_column2 
      FROM hittable GROUP BY hittable.user_agent, hittable.ip_address) AS anon_1
      

      【讨论】:

      • 非常好。不会想到这种方法,因为在 SQL 中输入很多。在 SQLA 中,这很容易!
      猜你喜欢
      • 2020-03-30
      • 1970-01-01
      • 2023-03-06
      • 2020-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-25
      相关资源
      最近更新 更多