【问题标题】:SQL QUERY to count repeats with 2 conditionsSQL QUERY 计算具有 2 个条件的重复次数
【发布时间】:2017-08-26 01:30:27
【问题描述】:

仅在满足两个条件时才查找重复项。在此示例中,仅当每个 customer_id 的订单大小为“大”且其相应日期早于其他实例时,才计算每个 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; 

我如何在其中包含日期方面?

【问题讨论】:

标签: sql teradata


【解决方案1】:

我相信您可以在子查询中使用窗口函数来决定要计算哪些行,然后在主查询中计算它们。比如:

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

那个大case语句分解如下:

  1. 如果这条记录是'Big',则忽略它
  2. 如果您按日期对每组customer_id/item_type 的所有记录进行排序并查看此记录之前的所有记录,则该记录组中的min(order_size)(按字典顺序排序)为@987654327 @那么你有一个大的日期,可以统计这条记录
  3. 否则……你数不过来。这只是带有order_size='small' 的记录,没有前面的'big'

【讨论】:

【解决方案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;

【讨论】:

  • 我想添加第二个条件以防万一让我们说'case when (OrderSize='Big' and item_type IN (Select item_type from table2) then date end) over....它抛出一个在 case 语句的 When 子句中说非法表达式时出错。我该如何解决这个问题?
  • 我已将上述查询请求作为新问题写在 When Case 语句中的子查询中 - 错误:case 语句 [Link] (stackoverflow.com/questions/48670005/…) 中的 When 子句中的非法表达式
  • @viji 。 . .如果您还有其他问题,您应该将其作为另一个问题而不是在评论中提出。请问您为什么不接受答案?
  • 我创建了一个单独的问题。我没有意识到通过接受另一个答案,这也将变得不被接受。对不起!
猜你喜欢
  • 2014-08-01
  • 2021-03-02
  • 2013-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多