SQL Server 2012 Поиск подходящих продуктов и дат - PullRequest
0 голосов
/ 30 апреля 2019

У меня есть таблица, как показано ниже:

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

Ценю любую помощь.

Ответы [ 2 ]

0 голосов
/ 30 апреля 2019

Этот следующий запрос предоставит желаемый результат-

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
0 голосов
/ 30 апреля 2019

Вот один из способов использования рекурсивного 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...