2009-03-12 7 views
0

J'ai une table qui ressemble à quelque chose comme çacomte et regroupés par T-sql

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

Les données pourraient alors être

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 

J'ai besoin maintenant deux questions sur ce tableau:

1) Je dois obtenir le nombre de rangées groupées par port et date (pas l'heure). La date est cependant un paramètre dans la question (dans ce cas, il pourrait s'agir de "2009-10-20"). Je veux aussi la dernière « activité » dans chaque heure

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) Je dois aussi une question de faire la même chose, mais regroupées par jour. Et le jour est comme je l'ai dit un paramètre entrant. Dans ce cas, il pourrait être « 2009-10-20 »

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

Notez que j'ai modifié mon SQL considérablement. Vous pouvez utiliser le nouveau code au lieu de votre version modifiée. ;) – Tomalak

+0

Oui ... Certainement. Merci. – Riri

Répondre

3

Étant donné que votre modèle de données ne sont pas correctement normalisée, c'est plus laid que cela devrait être.

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 

SQL pour faire le regroupement par jour est très similaire, je vous laisse dériver comme un exercice pour vous. ;-)

Je suis sûr qu'il y a d'autres façons d'obtenir le même résultat. Faire une vue de ce qui est la requête interne ici aidera à nettoyer la requête dans son ensemble.

+0

OK ... Presque je ne peux pas cependant l'obtenir pour montrer la dernière activité dans la journée ACTUELLE ... Il montre la dernière activité dans tous les jours – Riri

+0

J'ai changé un peu mon code. Je pensais trop compliqué. ;-) – Tomalak

+0

Il il .. Merci. Je l'ai un peu modifié et j'ai réussi à le faire fonctionner. – Riri