sql deux loggings les plus récents filtrés le jour

J'ai donc une table qui fait une request de logs. la table est la suivante:

Id SiteId StartedAt FinishedAt Url 1 2926 2015-08-10 14:53:00.230 2015-08-10 14:53:02.890 https://site1.com/Index.aspx 2 2928 2015-08-10 14:52:57.190 2015-08-10 14:53:33.107 https://site2.com/Admin/Index.aspx 3 2926 2015-08-10 14:53:02.897 2015-08-10 14:53:25.177 https://site1.com 4 2926 2015-08-10 14:53:02.897 2015-08-10 14:53:48.647 https://site2.com?ID=1 5 2926 2015-08-10 14:53:02.900 2015-08-10 14:53:48.947 https://site1.com/Tab?id=1 6 2926 2015-08-10 14:53:02.900 2015-08-10 14:53:48.377 https://site2.com/5 

J'ai besoin d'afficher ces requests dans une dernière et dernière request . Voir l'image ci-dessous.

entrez la description de l'image ici

J'essaie donc de sélectionner les deux requêtes les plus récentes faites pour une URL individuelle et je peux l'get. Voir: Demander les deux inputs les plus récentes par widget .

Cependant, cette list que j'utilise pour afficher la request a un sélecteur de date. Donc, l'user pourrait choisir disons 8/12/2015 et ce serait sélectionner toute la dernière request qui a commencé ce jour-là et chacune de ces requests montrerait alors la request précédente , qui ne peut pas nécessairement tomber le jour sélectionné, et la différence entre le deux.

Une ligne du balisage ci-dessus équivaudrait à deux lignes de ma sortie SQL. Donc, pour chaque URL unique, j'obtiens 2 lignes. Représentant la dernière request et celle juste avant.

Alors, voici où je suis actuellement:

 SELECT [Id], [FK_SiteId] as SiteId, [StartedAt],[FinishedAt],[Url] FROM SiteWarmupMesortingcs sw WHERE (Select Count(*) From SiteWarmupMesortingcs s Where sw.Url = s.Url AND s.StartedAt > sw.StartedAt) < 2 AND SUBSTRING(Url, CHARINDEX ('/', Url, 9), 500) = '/Index.aspx' ORDER BY sw.Url, sw.StartedAt 

Maintenant j'ai essayé d'append AND CONVERT(DATE, s.StartedAt) = '2015-08-10' mais AND CONVERT(DATE, s.StartedAt) = '2015-08-10' ne fonctionne pas vraiment. Je sens que je suis proche de manquer quelque chose.

Donc, voici le résultat que j'essaie d'get, mais avec une requête qui prend une date:

 Id SiteId StartedAt FinishedAt Url 20 2928 2015-08-10 16:12:39.430 2015-08-10 16:13:14.157 https://site1.com/Index.aspx 38 2928 2015-08-12 11:22:46.593 2015-08-12 11:23:16.183 https://site1.com/Index.aspx 19 2926 2015-08-10 16:12:39.430 2015-08-10 16:12:45.207 https://site2.com/Index.aspx 37 2926 2015-08-12 11:22:46.587 2015-08-12 11:22:52.030 https://site2.com/Index.aspx 

Tab était proche, besoin de partitionner par URL et non SiteID. En outre, l'union dans la sélection n'est pas nécessaire, select plutôt les lignes avec ROW_NUMBER () <= 2, de sorte qu'il va récupérer les deux premiers résultats de la cte.

 DECLARE @FromDate DATETIME = '2015-08-10' ;WITH cte AS ( SELECT [Id], [FK_SiteId] as SiteId, [StartedAt],[FinishedAt],[Url], ROW_NUMBER() OVER (PARTITION BY Url ORDER BY StartedAt DESC) AS rn FROM SiteWarmupMesortingcs WHERE CONVERT(DATE, StartedAt) <= CONVERT(Date, @FromDate) ) SELECT [Id], SiteId, [StartedAt],[FinishedAt],[Url] FROM cte WHERE cte.Rn <= 2 

SQL Server 2008 n'a pas la fonction LAG, mais il a ROW_NUMBER ().

Pour get les résultats dans votre dernier exemple de code, et en supposant que vous passiez la sélection du sélecteur de date de l'user en tant que paramètre appelé @FromDate cela devrait faire l'affaire:

 WITH cte AS ( SELECT [Id], [FK_SiteId] as SiteId, [StartedAt],[FinishedAt],[Url] ROW_NUMBER() OVER (PARTITION BY FK_SiteId ORDER BY StartedAt DESC) AS rn FROM SiteWarmupMesortingcs WHERE StartedAt >= @FromDate ) SELECT [Id], SiteId, [StartedAt],[FinishedAt],[Url] FROM cte WHERE rn=1 UNION ALL SELECT s1.[Id], s1.FK_SiteId AS SiteId, s1.[StartedAt],s1.[FinishedAt],s1.[Url] FROM cte LEFT OUTER JOIN SiteWarmupMesortingcs s1 ON cte.[Id]=( SELECT TOP 1 [Id] FROM SiteWarmupMesortingcs s2 WHERE cte.SiteId=s2.FK_SiteId AND s2.StartedAt < cte.StartedAt ORDER BY s2.StartedAt DESC ) WHERE cte.rn=1 ORDER BY SiteId, StartedAt 

EDIT: Ma première tentative a été confondue par le besoin d'get la première ligne après le paramètre FromDate, mais ensuite la ligne BEFORE, qui pourrait être soit avant ou après le paramètre. Ma requête actuelle devrait également résoudre ce problème.