मैं नीचे दिए गए उदाहरण में प्रत्येक वर्ग-संख्या के लिए पंक्तियों को किसी भी तरह से चिह्नित करना चाहता हूं जिसमें एक ही तारीख या पंक्तियों के साथ एक दूसरे के क्रम में पंक्तियां हों। इस तरह से लंबे समय तक पूरा करने की कोशिश की है लेकिन वास्तव में आपके साथ साझा करने के लिए कुछ भी मूल्यवान नहीं है ...

निम्नलिखित नमूना डेटा होना:

Date                      Class
2016-10-17 00:00:00.000   1
2016-10-20 00:00:00.000   1
2016-10-18 00:00:00.000   1
2016-10-25 00:00:00.000   1
2016-10-19 00:00:00.000   2
2016-10-19 00:00:00.000   2
2016-10-28 00:00:00.000   2
2016-10-25 00:00:00.000   3 

उपरोक्त तर्क के साथ, इसे उत्पादन करना चाहिए:

enter image description here

0
Andreas 19 अगस्त 2020, 00:47

2 जवाब

सबसे बढ़िया उत्तर

यह काम।

drop table if exists dbo.test_table;
go
create table dbo.test_table(
  [Date]        date not null,
  Class         int not null)

insert dbo.test_table([Date], Class) values
('2016-10-17',1),
('2016-10-20',1),
('2016-10-18',1),
('2016-10-25',1),
('2016-10-19',2),
('2016-10-19',2),
('2016-10-28',2),
('2016-10-25',3);

select tt.*,
       iif(datediff(day, tt.[Date], lead([Date]) over (partition by Class order by [Date])) in (0,1), 1, 0)+
       iif(datediff(day, lag([Date]) over (partition by Class order by [Date]), tt.[Date]) in (0,1), 1, 0) Marked
from dbo.test_table tt;
1
SteveC 19 अगस्त 2020, 05:36

हम्म । . . मुझे लगता है कि आप विंडो फ़ंक्शंस के परिणामों पर सशर्त तर्क चाहते हैं:

select t.*,
       (case when count(*) over (partition by class, date) > 1
             then 1
             when lag(class) over (partition by class order by date) = dateadd(day, -1, date)
             then 1
             when lead(class) over (partition by class order by date) = dateadd(day, 1, date)
             then 1
             else 0
         end) as mark
from t;
1
Gordon Linoff 19 अगस्त 2020, 02:25