我在jsonb字段中有一个带有推文的数据库表。 我有一个查询,以获得最转推的订阅推文,这就是它的样子:
SELECT * FROM (
SELECT DISTINCT ON (raw->'retweeted_status'->'id_str')
raw->'retweeted_status' as status,
raw->'retweeted_status'->'retweet_count' as cnt
FROM tweet
WHERE (raw->'retweeted_status') is not null
ORDER BY raw->'retweeted_status'->'id_str', cnt DESC
) t
ORDER BY cnt DESC
我正在尝试使用sqlalchemy创建此查询,这是我到目前为止的地方:
session.query(Tweet.raw['retweeted_status'],
Tweet.raw['retweeted_status']['retweet_count'].label('cnt'))\
.filter(~Tweet.raw.has_key('retweeted_status'))\
.distinct(Tweet.raw['retweeted_status']['id_str']).order_by(Tweet.raw['retweeted_status']['id_str'].desc()).subquery()
但是如何通过cnt从那里开始订购?
答案 0 :(得分:0)
它可能无法生成您显示的确切查询,但应指向正确的方向:您可以在'cnt'
中使用标记order_by
,例如:.order_by('cnt')
。
此外,您可以将标签用作sqlalchemy.desc
函数的参数。总结:
from sqlalchemy import desc
q = (
session.query(
Tweet.raw['retweeted_status'],
Tweet.raw['retweeted_status']['retweet_count'].label('cnt')
)
.filter(~Tweet.raw.has_key('retweeted_status'))
.distinct(
Tweet.raw['retweeted_status']['id_str']
)
.order_by(desc('cnt'))
).subquery()
其他提示:如果将其放在括号中,可以很好地格式化查询。
您也可以在python sqlalchemy label usage上阅读一般问题的答案。