SQL QUERY 计算 2 个条件下的重复次数
SQL QUERY to count repeats with 2 conditions
只有在满足两个条件时才查找重复项。在此示例中,仅当每个 customer_id 的订单大小为 "Big" 且其对应日期早于其他实例时,才对每个 customer_id 的项目类型进行重复计数。使用此代码可以实现第一个条件和重复。
Select Customer_id, Item_Type, COUNT(*)
from table
group by Customer_id, Item_Type
having count(*) > 1 and sum(case when Order_Size = 'Big' then 1 else 0 end) > 0;
如何将日期方面也包括在内?
我相信您可以在子查询中使用 window 函数来决定要计算哪些行,然后在主查询中对它们进行计数。类似于:
Select
customer_id, item_type, sum(count_pass) as Count
FROM
(
Select Customer_id,
Item_Type,
CASE
WHEN Order_Size = 'Big' THEN 0
WHEN MIN(Order_Size) OVER (PARTITION BY Customer_ID, Item_Type ORDER BY DateField ASC ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING) = 'BIG' THEN 1
ELSE 0
END as count_pass
FROM table
) subqry
GROUP BY 1,2
那个大案例语句分解如下:
- 如果这条记录是
'Big'
则忽略它
- 如果您按日期对每组
customer_id
/item_type
的所有记录进行排序,并查看该记录之前的所有记录,以及该组中的 min(order_size)
记录(按字典顺序排序)是 'Big'
然后你有一个大的前一个日期并且可以计算这条记录
- 不然……你数不过来。这只是带有
order_size
='small'
而没有前面的 'big'
的记录。
我会这样做:
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;
只有在满足两个条件时才查找重复项。在此示例中,仅当每个 customer_id 的订单大小为 "Big" 且其对应日期早于其他实例时,才对每个 customer_id 的项目类型进行重复计数。使用此代码可以实现第一个条件和重复。
Select Customer_id, Item_Type, COUNT(*)
from table
group by Customer_id, Item_Type
having count(*) > 1 and sum(case when Order_Size = 'Big' then 1 else 0 end) > 0;
如何将日期方面也包括在内?
我相信您可以在子查询中使用 window 函数来决定要计算哪些行,然后在主查询中对它们进行计数。类似于:
Select
customer_id, item_type, sum(count_pass) as Count
FROM
(
Select Customer_id,
Item_Type,
CASE
WHEN Order_Size = 'Big' THEN 0
WHEN MIN(Order_Size) OVER (PARTITION BY Customer_ID, Item_Type ORDER BY DateField ASC ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING) = 'BIG' THEN 1
ELSE 0
END as count_pass
FROM table
) subqry
GROUP BY 1,2
那个大案例语句分解如下:
- 如果这条记录是
'Big'
则忽略它 - 如果您按日期对每组
customer_id
/item_type
的所有记录进行排序,并查看该记录之前的所有记录,以及该组中的min(order_size)
记录(按字典顺序排序)是'Big'
然后你有一个大的前一个日期并且可以计算这条记录 - 不然……你数不过来。这只是带有
order_size
='small'
而没有前面的'big'
的记录。
我会这样做:
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;