2009-03-12 18 views
0

buSayım ve

CREATE TABLE MyTable(
    [RecordID] [bigint] IDENTITY(1,1) NOT NULL, 
    [PortName] [nvarchar](50) NULL, 
    [ReceivedEvent] [datetime] NULL, 
    [SentEvent] [datetime] NULL, 
); 

gibi görünür bir tablo var t-sql göre gruplandırılmış veriler daha sonra olabilir

RecordID | PortName | ReceivedEvent  | SentEvent 
    1  | Port1 | 2009-10-20 10:20:00 | NULL 
    2  | Port2 | NULL    | 2009-10-20 10:10:00 
    3  | Port2 | NULL    | 2009-10-20 10:02:00 
    4  | Port2 | NULL    | 2009-10-20 11:00:00 

Şimdi bu tablo üzerinden iki soru gerekir:

1) Bağlantı noktasına ve tarihe göre gruplanmış sayıda satır almam gerekiyor (zaman değil). Ancak tarih, sorudaki bir parametredir (Bu durumda "2009-10-20" olabilir). Ben de aynı zamanda bir soru aynı şeyi yapıyor gerek ama güne göre gruplandırılmış her saat

NumberOfRows | PortName | Hour | LastActivityInHour 
    2   | Port2 | 10 | 2009-10-20 10:10:00 
    1   | Port2 | 11 | 2009-10-20 11:00:00 
    1   | Port1 | 10 | 2009-10-20 10:20:00 

2) son "etkinlik" istiyorum. Ve gün gelen bir parametre dediğim gibi. Bu durumda "2009-10-20" Veri modeli düzgün normalize değildir

NumberOfRows | PortName | LastActivityInDay 
    3   | Port2 | 2009-10-20 11:00:00 
    1   | Port1 | 2009-10-20 10:20:00 
+0

SQL'imi önemli ölçüde değiştirdiğimi unutmayın. Tweaked sürümü yerine yeni kodu kullanmak isteyebilirsiniz. ;) – Tomalak

+0

Evet ... Kesinlikle. Teşekkürler. – Riri

cevap

3

beri bu olması gerekir daha çirkin bir olabilir.

SELECT 
    COUNT(t.RecordID) NumberOfRows, 
    t.PortName, 
    t.EventHour, 
    MAX(t.EventDateTime) LastActivityInHour 
FROM 
    (
    SELECT 
     RecordID, 
     PortName, 
     COALESCE(ReceivedEvent, SentEvent) EventDateTime, 
     DATEPART(hh, COALESCE(ReceivedEvent, SentEvent)) EventHour, 
     DATEADD(dd, 0, DATEDIFF(dd, 0, COALESCE(ReceivedEvent, SentEvent))) EventDate 
    FROM 
     MyTable 
) t 
WHERE 
    t.EventDate = DATEADD(dd, 0, DATEDIFF(dd, 0, @TheDateInQuestion)) 
GROUP BY 
    t.PortName, 
    t.EventHour 
ORDER BY 
    t.PortName, 
    t.EventHour 

tarafından güncel gruplandırılan SQL

çok benzer, senin için alıştırma olarak türetmek bırakacağız. ;-) Aynı sonucu elde etmenin başka yolları olduğundan emin olabilirim. Buradaki iç sorgunun bir görüntüsünü oluşturmak, sorguyu bir bütün olarak temizlemeye yardımcı olacaktır.

+0

Tamam ... Sonunda, CURRENT gün içindeki son etkinliği göstermek için bunu alamıyorum ... Tüm gün içinde son etkinliği gösterme – Riri

+0

Kodumu biraz değiştirdim. Çok karmaşık düşünüyordum. ;-) – Tomalak

+0

O o .. Teşekkürler. Biraz değiştirdim ve işe koyuldum. – Riri