私はより良い方法が存在することをかなり確信しているが、あなたはあなたのデータから数ヶ月を選択できる - ここのグループで最大日付で表される - その後、別途下記の各月の50パーセンタイルを計算すると:
months = select([func.max(tbl.c.date).label('date')]).\
group_by(func.date_trunc('month', tbl.c.date)).\
alias('months')
percentiles = select([
func.percentile_cont(0.5).
within_group(tbl.c.value).
label('median')]).\
where(tbl.c.date <= months.c.date).\
lateral('percentiles')
query = select([months.c.date,\
percentiles.c.median]).\
order_by(months.c.date)
結果ビーイング:必要に応じて
In [8]: engine.execute(query).fetchall()
2017-10-25 16:44:18,637 INFO sqlalchemy.engine.base.Engine SELECT months.date, percentiles.median
FROM (SELECT max(foo.date) AS date
FROM foo GROUP BY date_trunc(%(date_trunc_1)s, foo.date)) AS months, LATERAL (SELECT percentile_cont(%(percentile_cont_1)s) WITHIN GROUP (ORDER BY foo.value) AS median
FROM foo
WHERE foo.date <= months.date) AS percentiles ORDER BY months.date
2017-10-25 16:44:18,637 INFO sqlalchemy.engine.base.Engine {'percentile_cont_1': 0.5, 'date_trunc_1': 'month'}
Out[8]:
[(datetime.date(2017, 8, 24), 0.34),
(datetime.date(2017, 9, 26), 0.34),
(datetime.date(2017, 10, 28), 0.66)]
月の1日に日付を切捨ては、非常に簡単でなければなりません。 LATERALの代わりにスカラーサブクエリを使用することもできます。
(1)使用しているデータベースで質問にタグを付けてください。 (2)おそらく基本SQLを使う方が良いでしょう。 –