2014-10-13 3 views
0

Я неопытный в SQL/SQLAlchemy, и я пытаюсь написать SQLAlchemy запрос из таблицы называется событие с данными, такие как это:SQLAlchemy - Выберите строки с одинаковыми значениями столбцов, за исключением тех, со значениями из другого столбца

Я хотел бы выбрать строки с типом, равным «Viewed Tab», но только в том случае, если не существует строки с тем же значением сеанса, которое имеет тип, равный «Мобильный вид». Поэтому в приведенных выше образцах я хотел бы, чтобы запрос возвращал строки с EventId равными 150 и 154, но не 147.

Спасибо.

ответ

1

Предполагая, что таблица определена согласно ниже:

class Event(Base): 
    __tablename__ = 'events' 
    EventId = Column(Integer, primary_key=True) 
    Session = Column(Integer) 
    Type = Column(String) 

запрос для получения желаемого результата можно записать в виде:

viewed = aliased(Event, name='viewed') 
mobile = aliased(Event, name='mobile') 
qry = (session.query(viewed) 
     .filter(viewed.Type == 'Viewed Tab') 
     .outerjoin(mobile, and_(
      viewed.Session == mobile.Session, 
      mobile.Type == 'Mobile View') 
     ) 
     .filter(mobile.Session == None) 
     ) 

Это произведет запрос без каких-либо скоплений:

SELECT viewed."EventId" AS "viewed_EventId", 
     viewed."Session" AS "viewed_Session", 
     viewed."Type" AS "viewed_Type" 

FROM events AS viewed 

LEFT OUTER JOIN 
     events AS mobile 
    ON viewed."Session" = mobile."Session" 
    AND mobile."Type" = 'Mobile View' 

WHERE viewed."Type" = 'Viewed Tab' 
    AND mobile."Session" IS NULL 
0

Try:

select e.* 
    from event e 
    join (select eventid, session 
      from event 
     group by eventid, session 
     having sum(case when type = 'Viewed Tab' then 1 else 0 end) > 0 
      and sum(case when type = 'Mobile View' then 1 else 0 end) = 0) v 
    on e.eventid = v.eventid 

Я не уверен, что ограничения синтаксиса есть с SQL алхимии, однако.

Смежные вопросы