SQL Server: проблема синтаксиса с перекрывающимися датами - PullRequest
0 голосов
/ 10 мая 2018

У меня проблемы с выбором, который я не могу обернуть вокруг.У меня есть веб-интерфейс, в котором есть бизнес-правило, в котором диапазоны дат не могут перекрываться, и мне нужно идентифицировать их и удалить эти записи перед импортом, чтобы наш BU и обрабатывал их вручную.У меня есть 3 столбца Dealer_Number, Date_From и Date_To.

Например, вы видите, что у меня есть 2 диапазона данных: с 11/01/2017 по 30/30/2017 и 11/01/2017 до NULL, которые технически перекрываются.

У меня также есть случаи, когда у меня есть диапазоны дат ниже, которые также перекрываются, которые мне нужно идентифицировать и удалить:

05/02/2017 to 07/16/2017
03/05/2017 to 08/03/2017

Example

Я начал с нижеследующего, и я пытался использовать между и т. Д., Но не могу заставить его вернуть то, что я ожидаю:

SELECT 
    dealer_number, Date_From, Date_To 
FROM
    [MyTable] 
WHERE 
    dealer_number = 'HD0421' 
GROUP BY 
    dealer_number, Date_To, Date_From  
HAVING 
    COUNT (Date_From) > 1 
ORDER BY
    dealer_number ASC

DDL

 CREATE TABLE #tmp 
 (
     Dealer_Number [NVARCHAR](255) NULL,
     Date_From DATETIME NULL,
     Date_To DATETIME NULL
 )

 INSERT INTO #tmp 
 VALUES ('HD0421',  '11/01/2017', '11/30/2017'),
        ('HD0421',  '11/01/2017', '11/30/2017'),
        ('HD0421',  '11/01/2017', '11/30/2017'),
        ('HD0421',  '11/01/2017', '11/30/2017'),
        ('HD0421',  '11/01/2017', NULL),
        ('HD0421',  '11/01/2017', NULL),
        ('HD0421',  '11/01/2017', NULL),
        ('HD0421',  '11/01/2017', NULL),
        ('HD0421',  '12/01/2017', '01/25/2018'),
        ('DRE456',  '05/12/2017', '11/12/2017') , 
        ('DRE456',  '11/13/2017', '12/12/2017'),
        ('DRE456',  '01/12/2017', '06/12/2017'),
        ('DRE456',  '05/12/2017', '11/12/2017');

Любая помощь приветствуется!

1 Ответ

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

Используйте функцию row_number(), чтобы сгенерировать Seq, отфильтровать их и удалить, чтобы избежать совпадения дат

select * 
from (select *,
             row_number() over (partition by Dealer_Number, Date_From, Date_To order by Date_From) Seq
      from tmp
     ) t
where seq > 1;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...