【问题标题】:SQL Server 2012 Find bucket wise products and datesSQL Server 2012 查找存储桶明智的产品和日期
【发布时间】:2019-04-30 06:40:25
【问题描述】:

我有一张如下表:

date        prodname
2018-01-01  Product1
2018-01-05  Product1
2018-01-09  Product1
2018-01-17  Product1
2018-01-24  Product1
2018-01-26  Product1
2018-02-20  Product1
2018-01-02  Product2
2018-01-07  Product2
2018-01-09  Product2
2018-01-17  Product2
2018-01-28  Product2

代码:

CREATE TABLE myTemp(
Date Date,
ProductName varchar(10))

INSERT INTO myTemp values
('2018-01-01', 'Product1')
,('2018-01-05','Product1')
,('2018-01-09','Product1')
,('2018-01-17','Product1')
,('2018-01-24','Product1')
,('2018-01-26','Product1')
,('2018-02-20','Product1')
,('2018-01-02','Product2')
,('2018-01-07','Product2')
,('2018-01-09','Product2')
,('2018-01-17','Product2')
,('2018-01-28','Product2')

该表可以为每个产品包含任意数量的日期条目。 我想显示产品名称、最短日期和最短日期 + 24 天。我想为每 25 天的存储桶执行此操作。

例如, 对于 product1,2018-01-01 是最小日期,2018-01-25 是 PLUS 25 日期。 但是,product1 也有日期大于 2018-01-25 的记录。所以我应该在下面的输出中看到 product1 的另一条记录:

2018-01-26  2018-02-19  product1

2018-01-26 是 2018-01-25 之后的最小日期。 2109-02-19 是 PLUS 25 日期。 product1 是产品名称。

这样,我的最终输出应该是:

2018-01-01  2018-01-25  Product1
2018-01-26  2018-02-19  Product1
2018-01-02  2018-01-26  Product2
2018-01-28  2018-02-21  Product2

我尝试使用 min() 和 DateAdd() 进行操作,但它为每个产品提供了一行。

DROP TABLE IF EXISTS #MyTemp
select MIN(Date) CurrDate, DateAdd(d, 24, MIN(Date)) CurrPlus25Date, ProductName
into #MyTemp
from myTemp
group by ProductName

select * from #MyTemp

感谢任何帮助。

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

    这是使用递归 cte 的一种方法。如果您有一个数字/计数表,您可以简单地使用product cte 并与计数表交叉连接

    ; with 
    product as
    (
        select  ProductName,
                minDate = min(Date), 
                maxDate = max(Date)
        from    myTemp
        group by ProductName
    ),
    productdates as
    (
        select  ProductName, minDate, maxDate, 
            frDate = minDate, toDate = dateadd(day, 24, minDate)
        from    product
    
        union all
    
        select  ProductName, minDate, maxDate,
                frDate  = dateadd(day, 1, toDate),
                toDate  = dateadd(day, 25, toDate)
        from    productdates
        where   frDate  < maxDate
    )
    select  ProductName, frDate, toDate
    from    productdates
    order by ProductName, frDate
    

    【讨论】:

      【解决方案2】:

      以下查询将提供您想要的输出-

      SELECT C.min_datre,C.Plus_24_date,C.ProductName
      FROM
      (
          --Select data for the initial Date Range
           SELECT MIN(Date) AS min_datre,DATEADD(DD,24,MIN(Date)) AS Plus_24_date,
           ProductName
           FROM     myTemp
           GROUP BY ProductName
      
          UNION ALL 
      
          --Select Data for Out of first defined range
          SELECT MIN(B.Date),
          DATEADD(DD,24,MIN(B.Date)),
          ProductName
          FROM
          (
              --Select records per product with date greater 
              --than overall MIN(Date)+24
              SELECT 
              mt.date Date,
              mt.ProductName,
              A.min_date 
              FROM myTemp mt
              INNER JOIN (
                  SELECT MIN(Date) min_date,
                  DATEADD(DD,24,MIN(Date)) with_24_day,
                  ProductName
                  FROM     myTemp
                  GROUP BY ProductName
              ) A 
              ON mt.ProductName = A.ProductName
              AND mt.Date > A.with_24_day
          ) B
          GROUP BY B.ProductName
      ) C 
      ORDER BY 3,1
      

      【讨论】:

        猜你喜欢
        • 2016-02-15
        • 2013-03-17
        • 1970-01-01
        • 1970-01-01
        • 2018-09-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-15
        相关资源
        最近更新 更多