我正在使用SQLAlchemy(1.4/2.0过渡风格)访问PostgreSQL数据库。我使用group_by来计算按计数排序的唯一名称的数量。然后我需要做的是应用额外的group_by来计算相同的东西,但条件不同。例如,如果我有这个User对象
class User(Base):
__tablename__ = "user"
user_id = Column(Integer, primary_key=True)
name = Column(String)
city = Column(String)
我可以得到前100名最流行的用户名和那些使用该名称的计数:
stmt = select(User.name, func.count(User.user_id).label("total"))
.group_by(User.name)
.order_by(desc('total'))
.limit(100)
我要做的是在这100个最受欢迎的名字中,找出有多少人的名字是city == "New York", "Chicago","洛Angeles"我希望得到的数据像这样:
name: "Charles Smith", total:526, NY:28, Chi:17, LA:23
你知道怎么做吗?
Is straight SQL可以在count上使用FILTER子句来获取单个城市的计数,并使用标准计数来表示总数:参见下面的示例
select name, total, ny, chi, la
from ( select name
, count(*) total
, COUNT(*) FILTER (WHERE city='Chicago') chi
, COUNT(*) FILTER (WHERE city='Los Angeles') la
, COUNT(*) FILTER (WHERE city='New York') ny
from users
group by name
) sq;
我把它留给你来转换为SQLAlchemy;因为我可以通过阅读来理解它,但我不愿意尝试写出来。