前提・実現したいこと
テーブルの名前毎の最新データを取得したいです。
これよりもいい実装があればクエリ自体は変わっても問題ありません。
linesテーブルのもとからあるカラム(id, name等)であればlatest_linesのカラムが使用されるのですが、maxなどの関数を使用して取得したデータがうまく使用されないという状況です。
発生している問題・エラーメッセージ
pythonでlatest_lines.created_atと書いている部分が、なぜか実際のSQLではlinesのcreated_atに置き換わっています。
なので実際には最新ではないデータが返却されます。
python
1from sqlalchemy import desc, func 2from sqlalchemy.orm import aliased 3 4from app.database import session 5from app.models import Line 6 7latest_lines = aliased( 8 Line, 9 session.query( 10 Line.name.label("name"), 11 func.max(Line.created_at).label("created_at"), 12 ) 13 .group_by(Line.name) 14 .subquery("latest_lines"), 15) 16 17lines = ( 18 session.query(Line, latest_lines) 19 .filter(Line.name == latest_lines.name) 20 .filter(Line.created_at == latest_lines.created_at) 21 .group_by(Line.name) 22 .order_by(desc(Line.created_at)) 23 .all() 24)
↓実際に発行されているSQL(必要ないselectのカラムは削除してあります)
sql
1SELECT 2 `lines`.id AS lines_id, 3 `lines`.name AS lines_name, 4 `lines`.created_at AS lines_created_at, 5 latest_lines.name AS latest_lines_name 6FROM 7 `lines`, 8 ( 9 SELECT 10 `lines`.name AS name, 11 max(`lines`.created_at) AS created_at 12 FROM 13 `lines` 14 GROUP BY 15 `lines`.name 16 ) AS latest_lines 17WHERE 18 `lines`.name = latest_lines.name 19AND `lines`.created_at = `lines`.created_at 20GROUP BY 21 `lines`.name
補足情報(FW/ツールのバージョンなど)
Python 3.9.7
SQLAlchemy 1.4.23
MySQL 5.7.35
理想は以下のようなクエリを発行したいのですがjoinのサブクエリの記述方法がいまいちわからず上記のような書き方になっています。
sql
1select 2 id, 3 `lines`.name, 4 `lines`.created_at 5from 6 `lines` 7 join 8 ( 9 select 10 name, 11 max(created_at) as created_at 12 from 13 `lines` 14 group by 15 name 16 ) as `latest_lines` 17 on `lines`.name = latest_lines.name 18 and `lines`.created_at = latest_lines.created_at 19group by 20 `lines`.name 21order by 22 `lines`.name
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/09/05 09:46
2021/09/05 10:07
2021/09/05 11:50