【问题标题】:sql min date returning more than 1 recordsql min date 返回超过 1 条记录
【发布时间】:2013-06-16 15:26:46
【问题描述】:

我正在尝试为每个客户返回 1 条记录,以及来自另一个表(产品)的第一条记录。这些表与交集表连接在一起,我使用最小(日期)的日期是用户输入的日期。

我的 sql 可以正常工作,但我注意到有一些客户在产品表中具有多个相同日期的记录,因此它们被多次返回。我希望每个客户只能退回 1 件产品。数据库是 oracle,所以我尝试使用 rownum,但只为整个查询返回 1 条记录,所以我显然没有正确使用它。这是我的sql

SELECT  cust.ROW_ID prod.NAME, prod.DATE
FROM cust INNER JOIN ProdCust on cust.ROW_ID = ProdCust.CUST_ID
          INNER JOIN prod on ProdCust .PROD_ID = Prod.ROW_ID
          INNER JOIN
                    (SELECT ProdCust.CUST_ID, MIN (Prod.DATE) minDate
                     FROM ProdCust, Prod
                     WHERE ProdCust.PROD_ID = Prod.ROW_ID
                     GROUP BY CUST_ID
                    ) ProdCustMin on ProdCust.CUST_ID = ProdCustMin.CUST_ID AND prod.DATE = ProdCustMin.minDate 

【问题讨论】:

    标签: sql oracle


    【解决方案1】:

    在 Oracle 中,您可以使用 row_number() 来解决关系:

    SELECT  c.ROW_ID
    ,       p.NAME
    ,       p.DATE
    FROM    Cust c
    JOIN    (
            SELECT  row_number() over (partition by pc.CUST_ID order by p.DATE) rn
            ,       pc.CUST_ID
            ,       p.NAME
            ,       p.DATE
            FROM    Prod p
            JOIN    ProdCust pc 
            ON      pc.PROD_ID = p.ROW_ID
            ) p
    ON      c.ROW_ID = p.CUST_ID
            AND p.rn = 1 -- First row only 
    

    【讨论】:

      猜你喜欢
      • 2014-02-11
      • 2017-12-23
      • 2013-06-21
      • 1970-01-01
      • 2014-10-28
      • 2018-04-26
      • 1970-01-01
      • 2020-01-25
      • 1970-01-01
      相关资源
      最近更新 更多