【问题标题】:Sum Consecutive Months Based on Groups with Criteria根据具有标准的组对连续月份求和
【发布时间】:2020-04-27 14:46:18
【问题描述】:

我在缩小连续几个月发生的热门地区的销售额时遇到了麻烦。我知道我需要在Row_NumberDense_Rank 中使用某种形式的窗口函数,但我无法获得最终输出

这是我的源数据:

+--------+-----------+------------+
| Fruit  | SaleDate  | Top_Region |
+--------+-----------+------------+
| Apple  | 1/1/2017  |          1 |
| Apple  | 2/1/2017  |          1 |
| Apple  | 3/1/2017  |          1 |
| Apple  | 4/1/2017  |          0 |
| Apple  | 5/1/2017  |          0 |
| Apple  | 6/1/2017  |          0 |
| Apple  | 7/1/2017  |          1 |
| Apple  | 8/1/2017  |          1 |
| Apple  | 9/1/2017  |          1 |
| Apple  | 10/1/2017 |          1 |
| Apple  | 11/1/2017 |          0 |
| Apple  | 12/1/2017 |          0 |
| Banana | 1/1/2017  |          0 |
| Banana | 2/1/2017  |          0 |
| Banana | 3/1/2017  |          1 |
| Banana | 4/1/2017  |          1 |
| Banana | 5/1/2017  |          1 |
| Banana | 6/1/2017  |          1 |
| Banana | 7/1/2017  |          1 |
| Banana | 8/1/2017  |          1 |
| Banana | 9/1/2017  |          0 |
| Banana | 10/1/2017 |          1 |
| Banana | 11/1/2017 |          1 |
| Banana | 12/1/2017 |          0 |
+--------+-----------+------------+

这是预期的输出:

+--------+-----------+-----------+-------+
| Fruit  |   Start   |    End    | Total |
+--------+-----------+-----------+-------+
| Apple  | 1/1/2017  | 3/1/2017  |     3 |
| Apple  | 7/1/2017  | 10/1/2017 |     4 |
| Banana | 3/1/2017  | 8/1/2017  |     6 |
| Banana | 10/1/2017 | 11/1/2017 |     2 |
+--------+-----------+-----------+-------+

目标是在一个月内连续有顶级区域销售的实例。

到目前为止,我已经尝试了几种不同的组合,这是最接近的。

SELECT fruit,
        MIN(saledate) AS spanStart ,
        MAX(saledate) AS spanEnd,
        COUNT(*) AS spanLength
FROM    ( SELECT    s.* ,
                    ( ROW_NUMBER() OVER ( ORDER BY month )
                      - ROW_NUMBER() OVER ( PARTITION BY fruit, topregion ORDER BY month ) ) AS fruits
          FROM      #salesdata s
        ) s
GROUP BY fruit,fruits ,
        topregion
HAVING  topregion = 1
ORDER BY COUNT(*) DESC;

任何帮助将不胜感激

【问题讨论】:

    标签: sql-server aggregate-functions window-functions gaps-and-islands ranking-functions


    【解决方案1】:

    这是一个典型的差距和孤岛问题。一种策略是通过计算两个row_number()s 之间的差异来识别相邻行组的组。然后我们可以过滤具有top_region = 1 的组,并使用聚合来获取每个组的开始日期、结束日期和记录数。

    您的查询非常接近,但第一个row_number() 在其over() 子句中缺少partition by fruit。而且我发现在另一列称为fruit 的列fruits 的别名很容易出错。

    select 
        fruit,
        min(sale_date) start_date,
        max(sale_date) end_date,
        count(*) total
    from (
        select 
            t.*,
            row_number() over(partition by fruit order by sale_date) rn1,
            row_number() over(partition by fruit, top_region order by sale_date) rn2
        from mytable t
    ) t
    where top_region = 1
    group by fruit, rn1 - rn2
    order by fruit, start_date
    

    您可以单独运行内部查询以查看它产生的结果。

    Demo on DB Fiddle

    水果| 高分辨率照片| CLIPARTO开始日期 |结束日期 |全部的 :----- | :--------- | :--------- | ----: 苹果 | 2017-01-01 | 2017-01-03 | 3 苹果 | 2017-01-07 | 2017-01-10 | 4 香蕉 | 2017-01-03 | 2017-01-08 | 6 香蕉 | 2017-01-10 | 2017-01-11 | 2

    【讨论】:

      猜你喜欢
      • 2018-11-23
      • 2012-11-16
      • 1970-01-01
      • 2014-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-16
      • 1970-01-01
      相关资源
      最近更新 更多