2013-05-24 4 views
10

나는 할 수 없습니다SqlAlchem ​​y의 : 여러 열 이상의 별개의 수는

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

내가 할 수는 'pageload'의 고유 사용자 (수 DB 테이블 괜찮

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

).

일반적으로 이는 올바르지 않습니다. 예 : 다음 표 1 대신 2의 수를 줄 것이다 :

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

(적어도 PostgreSQL을에 유효) 다음과 같은 SQL을 생성 할 수있는 방법이 있나요?

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

답변

4

()는 SQLAlchemy의 구별 마치 하나의 열 또는 표현을 수용한다.

또 다른 방법은 group_bycount을 사용하는 것입니다.

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 
가 존재하는 경우 인덱스를 사용 할 수있을 것입니다 데이터베이스에서 그룹 -이 두 열의 concat 사용하는 것보다 더 효율적이어야한다

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

그것은 뭔가를 생성해야합니다 : 쿼리 객체에 추가 할 때

+0

아주 좋습니다. SQL에서 많은 타이핑을 할 때이 접근법을 생각하지 않았을 것입니다. SQLA에서 매우 쉽습니다! – EoghanM

11

distinct() 하나 개 이상의 인수를 받아

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 

조금 더 가까이에 있습니다.

관련 문제