SQL 到 PROC SQL- 按备选分区(最小情况)

SQL to PROC SQL- partition By alternative (min case)

我是 SAS 的新手,但知道 sql,所以尝试使用 SQL 代码编写 proc sql 代码,并意识到 PARTITION by 在 SAS 中不可用。

Table

Customer_id Item_type   Order Size  Date        ….

 1. A401    Fruit           Small      3/14/2016    …. 
 2. A401    Fruit           Big        5/22/2016    …. 
 3. A401    Vegetable       Small      7/12/2016    ….
 4. B509    Vegetable       Small      3/25/2015    …. 
 5. B509    Vegetable       Big        3/15/2014    …. 
 6. B509    Vegetable       Small      3/1/2014     ….

说明

  Customer_id   Item_Type   Count       Reason
1.A401          Fruit       2           X-WRONG-because date corresponding  big item is later than others in group  
2.B509          Vegetable   2           RIGHT-Note that count is 2 only because one of the dates is earlier than the Big corresponding item(3/1/2014 is earlier than 3/15/2014) 

SQL 输出

  Customer_id   Item_Type   Count       
1.B509          Vegetable       2   
select t.customer_id, t.item_type, count(*)
from (select t.*,
         min(case when OrderSize = 'Big' then date end) over (partition by customer_id, item_type) as min_big
  from t
 ) t
where date > min_big
group by t.customer_id, t.item_type;

在不支持window函数的SQL方言(MS Access、MySQL、SQLite、SAS'procsql)中,大多数PARTITION BY 调用可以替换为所有主要 SQL 方言都支持的相关聚合子查询。考虑以下调整:

select main.customer_id, main.item_type, count(*) as count
from 
   (select t.customer_id, t.item_type, t.date,
          (select min(case when OrderSize = 'Big' then date end) 
           from t sub
           where sub.customer_id = t.customer_id
           and sub.item_type = t.item_type) as min_big
    from t
   ) main
where main.date > main.min_big
group by main.customer_id, main.item_type;