使用 SQLAlchemy 对单个 table 进行多个 group_by 计数
Multiple group_by counts on single table using SQLAlchemy
我正在使用 SQLAlchemy(1.4/2.0 过渡风格)访问 PostgreSQL 数据库。我正在使用 group_by 来计算按计数排序的唯一名称的数量。然后我需要做的是应用额外的 group_by 来计算相同的事物,但条件不同。例如,如果我有这个用户对象
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 个最流行的名字,找出其中有多少个名字的城市 ==“纽约”、“芝加哥”和“洛杉矶”。我想像这样取回数据:
name: "Charles Smith", total:526, NY:28, Chi:17, LA:23
知道怎么做吗?
直接SQL可以在count上使用FILTER子句得到以标准count为总计的个别城市计数:见example here
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;
我留给你转换成SQL炼金术;因为我可以阅读它来理解,但我不太愿意尝试编写它。
我正在使用 SQLAlchemy(1.4/2.0 过渡风格)访问 PostgreSQL 数据库。我正在使用 group_by 来计算按计数排序的唯一名称的数量。然后我需要做的是应用额外的 group_by 来计算相同的事物,但条件不同。例如,如果我有这个用户对象
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 个最流行的名字,找出其中有多少个名字的城市 ==“纽约”、“芝加哥”和“洛杉矶”。我想像这样取回数据:
name: "Charles Smith", total:526, NY:28, Chi:17, LA:23
知道怎么做吗?
直接SQL可以在count上使用FILTER子句得到以标准count为总计的个别城市计数:见example here
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;
我留给你转换成SQL炼金术;因为我可以阅读它来理解,但我不太愿意尝试编写它。