0

これは単純なはずですが、私には理解できないようです。

これが私のテーブルです:

class UserEvent(Base):
    __tablename__ = 'user_events'

    user_id = Column(Integer, ForeignKey('users.user_id'),
                            primary_key=True, nullable=False)
    event_time = Column(DateTime, primary_key=True, nullable=False)
    detect_time = Column(DateTime, nullable=False)
    new_state = Column(Boolean, nullable=False)

そして、ここにいくつかのサンプルデータがあります:

+---------+---------------------+---------------------+-----------+
| user_id | event_time          | detect_time         | new_state |
+---------+---------------------+---------------------+-----------+
|       1 | 2012-11-12 16:12:00 | 2013-01-31 20:55:31 |         1 |
|       1 | 2012-11-12 18:24:00 | 2013-01-31 20:55:33 |         0 |
+---------+---------------------+---------------------+-----------+

各user_idの最新(event_time)UserEventを見つけたい。

私はこれを試しました:

for event, current in session.query(
        UserEvent, func.max(UserEvent.event_time)).group_by(
            UserEvent.user_id):

クエリは正しい「イベント」(2012-11-12 18:24:00)を返します。ただし、「current」がTrueであるため、JOINEDが正しくありません(または何か)。

テーブル内の行数に関係なく、常に最新のevent_timeとOLDESTnew_stateを取得します。

4

1 に答える 1

2

MySQLを使用していますか?その特定の式はクエリを生成します:

SELECT
    user_events.user_id,
    user_events.event_time,
    user_events.detect_time,
    user_events.new_state,
    max(user_events.event_time)
FROM
    user_events
GROUP BY
    user_events.user_id

これはほとんどのデータベースでは無効ですが、MySQLでランダムな行を提供します。http://news.ycombinator.com/item?id=5122798(偶然にも、SQLAlchemyの作者によって書かれた)から動作についてもっと知ることができます

この式は機能します:

for user_id, current in session.query(
    UserEvent.user_id, func.max(UserEvent.event_time)).group_by(
        UserEvent.user_id):

user_idのインスタンスの代わりに戻りますがUserEvent

このようなものはおそらくあなたが望むものを与えるでしょう:

t = session.query(
    UserEvent.user_id,
    func.max(UserEvent.event_time).label('max_time'),
).group_by(
    UserEvent.user_id,
).subquery().alias('t')

query = session.query(
    UserEvent,
).filter(and_(
    UserEvent.user_id == t.c.user_id,
    UserEvent.event_time == t.c.max_time,
))
于 2013-02-01T00:39:32.957 に答える