【问题标题】:SQLAlchemy Filter only minimum field value from distinct pairsSQLAlchemy 仅过滤来自不同对的最小字段值
【发布时间】:2020-12-10 14:56:38
【问题描述】:

我有一个ProductPurchase 模型,描述了client 进行的购买。

from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column
from sqlalchemy import DateTime
from sqlalchemy import String

Base = declarative_base()


class ProductPurchase(Base):
   __tablename__ = "product_client"
   
   client_id = Column(String(255))
   product_id = Column(String(255))
   purchased_at = Column(DateTime(timezone=True))

我想要做的是获取ProductPurchase 的列表,对于给定的product_id,我只会第一次购买client。 例如:

+-----------+------------+--------------+
| client_id | product_id | purchased_at |
+-----------+------------+--------------+
| c1        | prod1      | 2020-01-01   |
+-----------+------------+--------------+
| c1        | prod1      | 2020-01-02   |
+-----------+------------+--------------+
| c2        | prod1      | 2020-01-01   |
+-----------+------------+--------------+
| c2        | prod2      | 2020-01-01   |
+-----------+------------+--------------+

我想得到以下行:

+-----------+------------+--------------+
| client_id | product_id | purchased_at |
+-----------+------------+--------------+
| c1        | prod1      | 2020-01-01   |
+-----------+------------+--------------+
| c2        | prod1      | 2020-01-01   |
+-----------+------------+--------------+
| c2        | prod2      | 2020-01-01   |
+-----------+------------+--------------+

请注意,日期 2020-01-02 缺少 client_id=1product_id=1 对,因为它应该被过滤掉 - 目标是仅获得客户对产品的首次购买。 如何使用sqlalchemy 尝试此操作?

【问题讨论】:

    标签: python sql sqlalchemy


    【解决方案1】:

    在 SQLAlchemy 中,您可以通过 client_id 和 product_id 使用 groupy 并获取最少量的 purchase_at。

    类似的东西

    from sqlalchemy import func
    
    session.query(ProductPurchase.client_id ,ProductPurchase.purchased_id , func.min(ProductPurchase.purchased_at)).group_by(ProductPurchase.client_id ,ProductPurchase.purchased_id).all()
    

    【讨论】:

    • 这很简单,正是我想要的,谢谢
    【解决方案2】:

    这里是 sql 代码,sqlachemy 支持 all over() 和 PArition by statement 以及 cte 的使用,只需遵循 sqlachemy 文档:

    ;WITH cte AS (
    SELECT 
       *
      , rank() OVER (PARTITION BY p.client_id , p.product_id ORDER BY p.purchased_at ASC) rnk
     FROM 
    product AS p
    )
    
    SELECT cte.client_id
         , cte.product_id
         , cte.purchased_at
    FROM cte
    WHERE cte.rnk = 1
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-04-15
      • 2019-07-10
      • 2023-03-05
      • 2022-08-04
      • 2016-01-21
      • 1970-01-01
      • 2022-10-08
      相关资源
      最近更新 更多