Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Cara memeriksa Tanggal minimum di setiap pengamatan dan memperbarui bendera secara dinamis

Karena ini adalah pertanyaan awal - saya memposting jawabannya di sini. Saya sarankan membuang loop Anda bersama-sama. Berikut cara dengan 2 loop CTE dan ZERO.

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. Faktor-faktor apa yang dapat menyebabkan Kompilasi Ulang Prosedur Tersimpan di SQL Server?

  2. Seberapa sering indeks harus dibangun kembali di database SQL Server kami?

  3. TSQL Pilih baris Min &Max saat mengelompokkan

  4. Bagaimana cara memasukkan catatan ke dalam tabel database sql server express?

  5. Dapatkan hanya tanggal dari datetime sql tanpa mengonversi ke varchar sehingga saya dapat mengurutkannya di excel