2015-08-19 19 views
5

Yapmaya çalıştığım şey, tablodaki verilerin geri kalanının bir sütuna göre sabit kaldığı süreleri seçmek ve buradaki ikinci sütun değerinde bir değişiklik olup olmadığını kontrol etmektir. dönem.SQL Server - Verilerde değişiklik olmadan periyodların seçilmesi

Tablo: Ben almak istiyorum ne

create table #stable_periods 
(
[Date]    date, 
[Car_Reg]   nvarchar(10), 
[Internal_Damages] int, 
[External_Damages] int 
) 

insert into #stable_periods 
values ('2015-08-19', 'ABC123', 10, 10), 
     ('2015-08-18', 'ABC123', 9, 10), 
     ('2015-08-17', 'ABC123', 8, 9), 
     ('2015-08-16', 'ABC123', 9, 9), 
     ('2015-08-15', 'ABC123', 10, 10), 
     ('2015-08-14', 'ABC123', 10, 10), 
     ('2015-08-19', 'ABC456', 5, 3), 
     ('2015-08-18', 'ABC456', 5, 4), 
     ('2015-08-17', 'ABC456', 8, 4), 
     ('2015-08-16', 'ABC456', 9, 4), 
     ('2015-08-15', 'ABC456', 10, 10), 
     ('2015-01-01', 'ABC123', 1, 1), 
     ('2015-01-01', 'ABC456', NULL, NULL); 

--select * from #stable_periods 
-- Unfortunately I can’t post pictures yet but you get the point of how the table looks like 

Car_Reg \t FromDate \t ToDate \t   External_Damages Have internal damages changed in this period? 
 
ABC123 \t 2015-08-18 \t 2015-08-19 \t 10 \t    Yes 
 
ABC123 \t 2015-08-16 \t 2015-08-17 \t 9 \t    Yes 
 
ABC123 \t 2015-08-14 \t 2015-08-15 \t 10 \t    No 
 
ABC123 \t 2015-01-01 \t 2015-01-01 \t 1 \t    No 
 
ABC456 \t 2015-08-19 \t 2015-08-19 \t 3 \t    No 
 
ABC456 \t 2015-08-16 \t 2015-08-18 \t 4 \t    Yes 
 
ABC456 \t 2015-08-15 \t 2015-08-15 \t 10 \t    No 
 
ABC456 \t 2015-01-01 \t 2015-01-01 \t NULL \t    NULL
Temelde

[External_Damages] sabit ve onay [Internal_Damages yaptığı dönem çerçeveleri inşa etmek ] aynı dönemde değişiyor (kaç kez önemli değil). Çok fazla zaman harcayarak çalışıyorum ama korkarım ki, soyutlama seviyem çok düşüyor ... Herhangi bir öneri görmek harika olacak.

sayesinde

Bartosz

cevap

5

Bu Islands Problem şeklidir inanıyoruz. İşte

bir çözüm ROW_NUMBER ve GROUP BY kullanıyor:

SQL Fiddle

WITH CTE AS(
    SELECT *, 
     RN = DATEADD(DAY, - ROW_NUMBER() OVER(PARTITION BY Car_reg, External_Damages ORDER BY [Date]), [Date]) 
    FROM #stable_periods 
) 
SELECT 
    Car_Reg, 
    FromDate = MIN([Date]), 
    ToDate = MAX([Date]) , 
    External_Damages, 
    Change = 
      CASE 
       WHEN MAX(External_Damages) IS NULL THEN NULL 
       WHEN COUNT(DISTINCT Internal_Damages) > 1 THEN 'Yes' 
       ELSE 'No' 
      END  
FROM CTE c 
GROUP BY Car_Reg, External_Damages, RN 
ORDER BY Car_Reg, ToDate DESC 
+0

veri kümesi eksik günlerini ele verebilir herhangi bir seçenek var mı? Eğer yakın çevrelerde [External_Damages] aynı ise, o zaman kayıp günlerde aynı olacak ve birkaç gün içinde veri eksik günlerin neden olduğu aralar yerine uzun bir süre yaratabileceğimizi varsayalım? –

+0

@BartoszX, bunun için yeni bir soru oluşturmanızı öneriyorum. –