Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Как да проверите минималната дата във всяко наблюдение и динамично да актуализирате флага

Тъй като това е първоначалният въпрос - публикувам отговора тук. Бих предложил да изхвърлите вашите цикли заедно. Ето един начин с 2 CTE и НУЛА вериги.

declare @table table (ID int, StartDate date, EndDate date)
Insert Into @table
(
    ID
    , StartDate
    , EndDate
)
Values
(1,     '2017-01-01',    '2017-02-01'),
(1,     '2017-01-09',    '2017-01-28'),
(1,     '2017-04-01',    '2017-04-30'),
(1,     '2017-04-05',    '2017-05-20'),
(1,     '2017-04-20',    '2017-06-12'),
(2,     '2017-06-02',    '2017-06-20'),
(2,     '2017-06-14',    '2017-07-31'),
(2,     '2017-06-14',    '2017-07-31'),
(2,     '2017-06-19',    '2017-07-31'),
(2,     '2017-06-19',    '2017-07-31')


;with cte as(
select
    t1.ID
    ,t1.StartDate
    ,t1.EndDate
    ,DT = (select min(StartDate) from @table t2  where t2.StartDate > DATEADD(day,30,t1.StartDate))
from
    @table t1),

cte2 as(
select
    ID
    ,StartDate
    ,EndDate
    ,dense_rank() over (order by isnull(DT,(select max(StartDate) from cte))) as Flag
from
    cte)

select 
    ID
    ,StartDate
    ,EndDate
    ,case when Flag % 2 = 0 then 2 else Flag % 2 end as Flag
from cte2


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. 7 начина за връщане на всички таблици с първичен ключ в SQL Server

  2. Мониторинг на TempDB на SQL Server чрез използване на динамични изгледи за управление (DMV)

  3. Изтриване от CTE с присъединяване

  4. Възможно ли е да се конкатенират стойностите на колоните в низ с помощта на CTE?

  5. Използвайте SQL сертификат от друга база данни