Определите записи, повторяющиеся в течение установленного периода времени с момента их первого создания в SQL - PullRequest
0 голосов
/ 20 мая 2018

Попытка выяснить запрос, который может сработать для поиска записей, которые повторяются в течение предварительно определенного периода времени после первого создания.

Скажем, к примеру, я хочу определить клиентов, которые размещают второй заказ в течение 1 месяца с момента их последней покупки.

В следующем примере Том и Джефф оба являются повторяющимися клиентами.Но только Джефф отвечает критериям размещения второго заказа в течение месяца:

Record Customer     Date
1      Tom          6/26/2018
2      Carly        6/31/2018
3      Jeff         7/1/2018
4      Jeff         7/20/2018
5      Tom          8/3/2018

Я пытаюсь это выяснить, не определяя фактические даты, так как я хочу, чтобы дата начала была установлена ​​в первый раззапись была найдена в таблице.

Есть ли способ для SQL сделать это?

Примечание: пожалуйста, дайте мне знать, если нужно уточнить, английский не мой родной язык.

Ответы [ 4 ]

0 голосов
/ 20 мая 2018

Я считаю, что для этого также можно использовать комбинацию LAG & DATEADD & IIF (или CASE).
Затем вы получаете 1 или 0 для каждой даты клиента по сравнению с предыдущей датой клиента.

Который затем можно суммировать.

Это альтернатива, которая не требует самостоятельного объединения.

declare @Table1 table (ID int identity(1,1) primary key, Customer varchar(5), [Date] datetime);

INSERT INTO @Table1 ([Date],Customer) VALUES
('2018-06-26','Tom'),
('2018-07-02','Carly'),
('2018-07-01','Jeff'),
('2018-07-20','Jeff'),
('2018-07-23','Jeff'),
('2018-08-03','Tom');

SELECT Customer, SUM(PreviousDateWithinMonth) as TotalWithinMonth
FROM
(
    SELECT * , IIF(DATEADD(month,1,lag([Date]) OVER (PARTITION BY Customer ORDER BY [Date])) >= [Date],1,0) AS PreviousDateWithinMonth
    FROM @Table1 t1
) q
GROUP BY Customer
HAVING SUM(PreviousDateWithinMonth) > 0
ORDER BY TotalWithinMonth DESC;
0 голосов
/ 20 мая 2018
CREATE TABLE Table1
    ([Record] int, [Customer] varchar(5), [Date] datetime)
;

INSERT INTO Table1
    ([Record], [Customer], [Date])
VALUES
    (1, 'Tom', '2018-06-26 00:00:00'),
    (2, 'Carly', '2018-07-01 00:00:00'),
    (3, 'Jeff', '2018-07-01 00:00:00'),
    (4, 'Jeff', '2018-07-20 00:00:00'),
    (5, 'Jeff', '2018-07-23 00:00:00'),
    (6, 'Tom', '2018-08-03 00:00:00')
;

select Customer,count(1) OrderCount from (
  select distinct T1.* 
  from Table1 T1
  left join Table1 T2 on 
    T1.Record <> T2.Record
    and T1.Customer = T2.Customer 
    and DATEDIFF ( month , T1.[Date] , T2.[Date] ) =0 
  where T2.Record is not null
) T
group by Customer;

| Customer | OrderCount |
|----------|------------|
|     Jeff |          3 |

Демоверсия SQL Fiddle


Надеюсь, это поможет вам: -)

0 голосов
/ 20 мая 2018

Вы можете попытаться использовать функцию Windows с CTE Запросом сделать RowNumber

, а затем самостоятельно присоединиться к запросу CTE и сравнить разницу месяцев между первымистрока и вторая строка.

выглядит следующим образом.

;with cte as(
  SELECT *,ROW_NUMBER() OVER(partition by Customer ORDER BY Record) rn
  FROM T 
)
select t1.Customer
from 
cte t1 left join cte t2
ON t1.Record < t2.Record and t1.Customer = t2.Customer 
and t1.rn = 1 and t2.rn = 2
where DATEDIFF( month , t1.[Date] , t2.[Date])=0

sqlfiddle: http://sqlfiddle.com/#!18/01e3b/7

0 голосов
/ 20 мая 2018

Есть много способов сделать это, один из возможных методов - это sefl соединение.
В приведенном ниже запросе перечислены клиенты, у которых было более 1 покупки в течение 1 месяца, указаны дата самой старой покупки, число и дата последней покупки в течение этого периода:

SELECT t1.Customer, min(t1.date), count(*), max(t2.date) 
FROM tablename t1
JOIN tablename t2 ON t2.date >= t1.date AND t2.date < t1.date + interval '1' month
GROUP BY t1.Customer
HAVING count(*) > 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...