Je pense que la sortie correspond effectivement à l'échantillon des données: le 25 (00 heures), il y a deux bugs ouverts. Le 26, il y a un bug ouvert et un fermé. Et le 27, tous les bugs sont fermés.
Il n'est pas clair comment les dates principales devraient être créées. Pour mon exemple, j'ai pré-chargé les dates que je savais être correctes mais cela pourrait être accompli de diverses manières en fonction des besoins de l'utilisateur.
Quoi qu'il en soit, le code est ci-dessous. Cela devrait fonctionner pour les cas où un bug est ouvert et fermé plusieurs fois le même jour. Il fonctionne sous l'hypothèse qu'un bug ne peut pas être ouvert et fermé en même temps.
/** Setup the tables **/
IF OBJECT_ID('tempdb..#bugs') IS NOT NULL DROP TABLE #bugs
CREATE TABLE #bugs (
BugID INT,
[Timestamp] DATETIME,
[Status] VARCHAR(10)
)
IF OBJECT_ID('tempdb..#dates') IS NOT NULL DROP TABLE #dates
CREATE TABLE #dates (
[Date] DATETIME
)
/** Load the sample data. **/
INSERT #bugs
SELECT 1, '2010-06-24 10:00:00', 'open' UNION ALL
SELECT 2, '2010-06-24 11:00:00', 'open' UNION ALL
SELECT 1, '2010-06-25 12:00:00', 'closed' UNION ALL
SELECT 2, '2010-06-26 13:00:00', 'closed'
/** Build an arbitrary date table **/
INSERT #dates
SELECT '2010-06-24' UNION ALL
SELECT '2010-06-25' UNION ALL
SELECT '2010-06-26' UNION ALL
SELECT '2010-06-27'
/**
Subquery x:
For each date in the #date table,
get the BugID and it's last status.
This is for BugIDs that have been
opened and closed on the same day.
Subquery y:
Drawing from subquery x, get the
date, BugID, and Status of its
last status for that day
Main query:
For each date, get the count
of the most recent statuses for
that date. This will give the
running totals of open and
closed bugs for each date
**/
SELECT
[Date],
COUNT(*) AS [#],
[Status]
FROM (
SELECT
Date,
x.BugID,
b.[Status]
FROM (
SELECT
[Date],
BugID,
MAX([Timestamp]) AS LastStatus
FROM #dates d
INNER JOIN #bugs b
ON d.[Date] > b.[Timestamp]
GROUP BY
[Date],
BugID
) x
INNER JOIN #bugs b
ON x.BugID = b.BugID
AND x.LastStatus = b.[Timestamp]
) y
GROUP BY [Date], [Status]
ORDER BY [Date], CASE WHEN [Status] = 'Open' THEN 1 ELSE 2 END
Résultats:
Date # Status
----------------------- ----------- ----------
2010-06-25 00:00:00.000 2 open
2010-06-26 00:00:00.000 1 open
2010-06-26 00:00:00.000 1 closed
2010-06-27 00:00:00.000 2 closed
Je pense que vous aurez besoin d'utiliser l'un des totaux de fonctionnement des solutions ici (peut-être un curseur) http://www.sqlteam.com/article/calculating-running -totaux. –
La sortie désirée n'est PAS un histogramme (http://en.wikipedia.org/wiki/Histogram) et ne correspond PAS aux données d'échantillon fournies. –
@Brock Adams: J'ai renommé 'Histogram' pour 'Running Total' afin de rendre plus facile de voir que la sortie désirée correspond aux données de l'échantillon – Eduardo