SQL

2010-04-22 14 views
6

kullanarak veritabanı kayıtlarındaki boşlukları (eksik kayıtları) bulma Her ardışık saat için bir kayıtları olan bir tablom var. Her saatin bir değeri vardır. Eksik kayıtları (eksik saatler, boşluklar) almak için bir T-SQL sorgusu istiyorum. Bu nedenle, aşağıdaki DDL için, 04/01/2010 02:00 (saat aralığı ilk ve son kayıt arasında olduğu varsayılarak) eksik saat için bir kayıt almalıyım. SQL Server 2005'i kullanarak. Set tabanlı bir sorguyu tercih edin. Bunu çözmenin GörebildiğimSQL

DDL: 
CREATE TABLE [Readings](
    [StartDate] [datetime] NOT NULL, 
    [SomeValue] [int] NOT NULL 
) 
INSERT INTO [Readings]([StartDate], [SomeValue]) 
SELECT '20100401 00:00:00.000', 2 UNION ALL 
SELECT '20100401 01:00:00.000', 3 UNION ALL 
SELECT '20100401 03:00:00.000', 45 

cevap

15

tüm kayıtlar varsayarsak kesin saatleri:

WITH q(s, e) AS 
     (
     SELECT MIN(StartDate), MAX(StartDate) 
     FROM Readings 
     UNION ALL 
     SELECT DATEADD(hour, 1, s), e 
     FROM q 
     WHERE s < e 
     ) 
SELECT * 
FROM q 
WHERE s NOT IN 
     (
     SELECT StartDate 
     FROM Readings 
     ) 
OPTION (MAXRECURSION 0) 
+2

OMG .... o bu yazdı kadar hızlı şekilde olağanüstü bir durumdur. Sadece AWESOME. – Raja

+0

Bu oyuna bakamıyorum ya da aşağıya bakamam Bu sql'a bakıyorum .. gaaaaahhahahaaaa –

+0

Bu tatlı bir sorgu. Asla 'WITH' nin yinelemeli olarak kullanılabileceğini hiç anlamadım. – RedFilter

0

tek yol var beklemek tüm tarihler içeren bir tablo oluşturun ve ardından bir sen boşlukları gözden geçirmek istediğiniz masaya katılmak gerçekleştirmek olacaktır. Belirli bir süre içinde tüm boşlukları bulmak istediğinizde yeni bir tablo oluşturmak zorunda kalmamanız için, bu iki tarih arasındaki tüm saatlik tarihleri ​​içeren bir tablo 2 tarih döndüren bir işlev oluşturabilirsiniz.

Bu, tüm tarihleri ​​içeren tabloya sahip olduğunuzda, ayarlanmış bir çözümdür. Tarihler içeren bir tablo oluşturmadan bunu yapmanın bir yolu olduğunu sanmıyorum ve eminim ki bunu set bazlı bir şekilde yapamazsınız.