【问题标题】:top 1 first_value() based on two criteriatop 1 first_value() 基于两个标准
【发布时间】:2022-09-23 19:06:05
【问题描述】:

我还是 mssqlserver 的新手,我需要根据品牌名称和 customer_id 在特定时期为同一客户下订单获取第一个订单我使用 first_value() 作为前 1 的子查询但是我只得到第一个值基于品牌而不考虑客户 ID

我得到了什么

Data Customer_ID Brand first_order
2022-01-01 1649104 PH 2020-09-26
2022-01-01 1306498 PH 2020-09-26
2022-01-01 1290371 PH 2020-09-26
2022-01-01 456756 TB 2020-11-09
2022-01-01 1823713 TB 2020-11-09
2022-01-01 2178025 BK 2020-08-12
2022-01-01 216435 BK 2020-08-12
2022-01-01 19031 BK 2020-08-12
2022-01-01 438095 BK 2020-08-12

我使用的代码

SELECT Data , Brand  ,  Customer_ID  ,
(select  top 1 first_value(H.Data) over (partition by Customer_ID , Brand order by H.Data ASC) 
from ORDER H
where h.Customer_ID = Customer_ID and H.Brand = Brand 
) as firts_order
from ORDER
LEFT OUTER JOIN ORDER_SOURCE SRC ON SRC.SRC_ID = ORDR_SOURCE

WHERE SRC_NAME IN (\'SR 1\' , \'SR 2\') and DATE  = \'2022-01-01\'   

    标签: sql-server


    【解决方案1】:

    我之前没有使用过first_value() 窗口函数,但我敢打赌,您不需要子查询。反而:

    SELECT Data, 
       Brand,  
       Customer_ID, 
       FIRST_VALUE(Data) OVER (PARTITION BY Customer_ID, Brand ORDER BY Data) as first_order
    FROM ORDER
        LEFT OUTER JOIN ORDER_SOURCE SRC ON SRC.SRC_ID = ORDR_SOURCE
    WHERE SRC_NAME IN ('SR 1' , 'SR 2') AND DATE  = '2022-01-01' 
    

    或者你可以使用相关子查询 INSTEAD。您无需将其与窗口函数结合使用。虽然,我不会推荐它,因为窗口函数路由会更快。

    SELECT Data , Brand  ,  Customer_ID  ,
      (
        select top 1 H.data
        from ORDER H
        where H.Customer_ID = O.Customer_ID 
            and H.Brand = O.Brand 
        ORDER BY H.Data ASC
      ) as first_order
    from ORDER O
    LEFT OUTER JOIN ORDER_SOURCE SRC ON SRC.SRC_ID = ORDR_SOURCE    
    WHERE SRC_NAME IN ('SR 1' , 'SR 2') and DATE  = '2022-01-01'   
    

    【讨论】:

    • 感谢您的支持,第一个查询很好,但我需要比 2022 年 1 月之前的日期更早的 first_order,第二个查询也在 first_order 中获得一个值,而不是每个品牌的每个客户 ID
    • 对于第一个,查询是否应该在 WHERE 子句WHERE data < '2022-01-01' 中?
    • 它将获得日期订单和一月之前的第一个订单的日期,我需要一月的订单日期以及一月之前同一客户和同一品牌的第一笔订单
    【解决方案2】:

    在解决之后,我找到了一个更有效的解决方案,使用 min() 而不是 first_value()

    enter code here
    

    选择 H.Data,H.Brand,H.Customer_ID,O.Data 从订单 H 左外连接 ORDER_SOURCE SRC ON SRC.SRC_ID = H.ORDR_SOURCE
    左外连接 ( select min(Data) AS Data, Brand, Customer_ID
    从订单 SRC_ID = ORDR_SOURCE 上的左外连接 ORDER_SOURCE
    WHERE SRC_NAME IN ('SR 1' , 'SR 2') GROUP by Brand, Customer_ID ) 作为 ON H.Brand = O.Brand AND H.Customer_ID = O.Customer_ID WHERE SRC_NAME IN ('SR 1' , 'SR 2') 和 DATE = '2022-01-01'

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-06
      • 1970-01-01
      • 2017-12-31
      相关资源
      最近更新 更多