Обнаружение перекрывающихся дат и обновление новейшей записи SQL Server 2008 - PullRequest
0 голосов
/ 31 января 2019

Я хочу иметь возможность обнаруживать все записи (некоторые дублированные) и отмечать те, которые перекрываются (записи, загруженные после) другими, как OVER.Для этого у меня есть SELECT, чтобы вернуть существующие перекрывающиеся записи, и CTE, чтобы установить для этого столбца значение OVER.

Моя проблема заключается в том, чтобы адаптировать запрос выбора, чтобы пометить самое новое с этим значением и сохранить его внутри cte какЯ не знаком с SQL.

Выбор:

select t.* 
    from testtable t where exists 
    (select 1 from testtable t2 
    where t.idd = t2.idd
            AND t.id<>t2.id
            AND t2.beg <= t.end
            AND t.beg <= t2.end)

Половина сделанного CTE:

;with cte
        as (select t.*, Row_number() over (partition by idd order by date_uploaded desc) RN 
            from testtable as t)
    update cte set overlapped = 'OVER'
    where RN > 1
    and (overlapped is null or overlapped <> 'UNIQUE')

Пример данных, как это должно выглядеть:

overlapped ID   idd    iduser iddate name beg end date_uploaded
UNIQUE  52  -1907372231 666 201802  sol 2018-09-01  2018-09-10  2018-09-12 
OVER    53  -1907372231 666 201802  sol 2018-09-10  2018-09-12  2018-09-13 

Обратите внимание, как строка 53 перекрывает дату BEG с END

Любая помощь с моей проблемой, она очень ценится.

1 Ответ

0 голосов
/ 31 января 2019

Вместо обновления CTE используйте выражение CASE, когда выбираете из него:

;with cte
        as (select t.*, Row_number() over (partition by idd order by date_uploaded desc) RN 
            from testtable as t)
    SELECT CASE 
      WHEN RN > 1 and (overlapped is null or overlapped <> 'UNIQUE') THEN 'OVER'
      ELSE overlapped
    END AS overlapped
FROM cte
...