T-SQL Выявление пробелов в неправильной последовательности дат - PullRequest
0 голосов
/ 16 ноября 2018

Пожалуйста, вы можете помочь мне решить проблему, которая, как мне кажется, связана с проблемой пробелов и островков в T-SQL. Я использую SQL Server 2014.

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

См. Ниже T-SQL, чтобы продемонстрировать, чего я пытаюсь достичь, в частности, как рассчитать столбец Rnk, который для демонстрационных целей я жестко запрограммировал вручную?

CREATE TABLE #test (RowID INT IDENTITY(1,1), FileDate DATE, TableName VARCHAR(100), IndexName VARCHAR(100), Rnk INT)

INSERT INTO #test (FileDate, TableName, IndexName, Rnk) 
VALUES
('2015-10-31', 't1', 'idx1', 1),
('2015-10-30', 't1', 'idx1', 2),

('2015-10-27', 't1', 'idx1', 1),
('2015-10-26', 't1', 'idx1', 2),
('2015-10-25', 't1', 'idx1', 3),

('2015-10-23', 't1', 'idx1', 1),
('2015-10-22', 't1', 'idx1', 2),
('2015-10-21', 't1', 'idx1', 3),
('2015-10-20', 't1', 'idx1', 4),
('2015-10-19', 't1', 'idx1', 5),
('2015-10-15', 't1', 'idx1', 1),
('2015-10-13', 't1', 'idx1', 1),
('2015-10-10', 't1', 'idx1', 1),
('2015-10-09', 't1', 'idx1', 2),

('2015-10-27', 't3', 'idx13', 1),
('2015-10-26', 't3', 'idx13', 2),
('2015-10-25', 't3', 'idx15', 1),
('2015-10-24', 't3', 'idx15', 2),
('2015-10-21', 't3', 'idx13', 1)

SELECT * FROM #test 

DROP TABLE #test

На скриншоте, который я прикрепил, выделенная часть результатов показала бы, что я хочу, чтобы столбец Rnk располагал последовательность последовательного появления t1 / idx между 2015-10-27 - 2015-10-25, но сбросил число для следующее появление в 2015-10-23 до 2015-10-19.

Может кто-нибудь помочь мне, пожалуйста?

IMG1

Спасибо.

Ответы [ 3 ]

0 голосов
/ 16 ноября 2018

Вычтите последовательность чисел из даты - и у идентифицированных вами групп будет постоянное значение. Тогда вы можете использовать row_number():

select t.*,
       row_number() over (partition by tablename, indexname,
                                       dateadd(day, - seqnum, filedate)
                          order by filedate desc
                         ) as rnk
from (select t.*,
             row_number() over (partition by tablename, indexname order by filedate) as seqnum
      from t
     ) t
0 голосов
/ 16 ноября 2018

Аналогично ответу Йогеша, который избил меня.
(подсказка: не ожидайте, что быстрее будет набирать ответ на вашем телефоне)

SELECT 
RowID, FileDate, TableName, IndexName, 
ROW_NUMBER() OVER (PARTITION BY TableName, IndexName,  DateRank ORDER BY FileDate DESC) AS Rnk
FROM
(
  SELECT *,
  SUM(DateGap) OVER (PARTITION BY TableName, IndexName ORDER BY FileDate DESC) AS DateRank
  FROM
  (
      SELECT RowID, FileDate, TableName, IndexName,
      --  Rnk as ExpRnk,
      CASE WHEN DATEDIFF(DAY, FileDate, LAG(FileDate) OVER (PARTITION BY TableName, IndexName ORDER BY FileDate DESC)) <= 1 THEN 0 ELSE 1 END AS DateGap
      FROM #Test
  ) q1
) q2
ORDER BY RowID;
0 голосов
/ 16 ноября 2018

Я бы использовал кумулятивный подход:

select t.FileDate, t.TableName, t.IndexName,
       row_number() over (partition by tablename, indexname, grp order by rowid)
from (select t.*, sum(case when gap > 1 then 1 else 0 end) over (partition by tablename, indexname order by rowid) as grp
      from (select t.*, 
                   isnull(datediff(day, filedate, lag(filedate) over (partition by tablename, indexname order by rowid)), 1) as gap
            from #test t
           ) t
     ) t;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...