7
votes

requête SQL pour résoudre ce qui suit

Je dois suivre le tableau de SQL Server:

INTERVAL                                  FAILED      OK
2009-01-01 12:00:00-2009-01-01 12:15:00    1           2
2009-01-01 12:15:01-2009-01-01 12:30:00    0           1


1 commentaires

Vous dites toutes les 10 minutes mais l'exemple montre tous les 15 ..


6 Réponses :


0
votes

Parce que je ne connais pas votre nom de table, quelque chose comme ça devrait fonctionner.

DECLARE @startTime DATETIME
DECLARE @endTime DATETIME

SELECT @startTime = '1/1/2010 00:00:00'
SELECT @endTime = GETDATE()

SELECT 
    cast(@startTime as varchar) + ' - ' + cast(@endTime as varchar) as Interval, 
    (select count(1) from [table] where status = 'FAILED') as FAILED, 
(Select count(1) from [table where status = 'OK') as OK
FROM
    [table]
WHERE
    date between @startTime and @endTime


2 commentaires

Cela ne prend pas en compte l'intervalle dont vous avez besoin, mais vous pouvez l'utiliser pour sélectionner manuellement le délai.


Vous devriez faire une boucle pour obtenir tous les résultats.



1
votes

Il pourrait y avoir un moyen plus facile de le faire, mais cela fonctionne:

--CREATE TABLE temptest
--(
--  date1 DATETIME,
--  stat nvarchar(10)
--)

--INSERT INTO temptest
--VALUES 
--('2009-01-01 12:00:00','OK'),
--('2009-01-01 12:03:00','FAILED'),
--('2009-01-01 12:04:00','OK'),
--('2009-01-01 12:06:20','OK'),
--('2009-01-01 12:07:35','FAILED'),
--('2009-01-01 12:07:40','FAILED'),
--('2009-01-01 12:20:40','FAILED'),
--('2009-01-01 12:25:40','OK')

SELECT
    stat,
    COUNT(1),
    YEAR(date1),
    MONTH(date1),
    DAY(date1),
    DATEPART(hh,date1),
    ROUND(DATEPART(MINUTE,date1)/10,0)
FROM temptest
GROUP BY stat, YEAR(date1), MONTH(date1), DAY(date1), DATEPART(hh,date1), ROUND(DATEPART(MINUTE,date1)/10,0)


0 commentaires

0
votes

Ceci utilise un CTE récursif. xxx

La sortie ressemble à ceci: xxx

Veuillez noter dans vos données que vous avez le même nombre d'échecs et d'ok dans les emplacements horaires .


0 commentaires

2
votes

OK Tout d'abord ..

Vous mentionnez 10 minutes et la fourniture d'un exemple avec 15 minutes .. En outre, vos échantillons de données doivent renvoyer différents résultats que ce que vous avez posté ..

Solution à l'aide de pivot xxx

ceci retournera xxx

mise à jour après les commentaires < / em>

Cette version inclura des intervalles de temps qui n'ont pas de valeurs dans la base de données. Nous devrons créer une table temporaire sur la volée .. xxx

Utilisation d'un intervalle de 10 minutes maintenant, pour afficher une période sans valeurs, retourne .. < Pré> xxx


5 commentaires

Une fois que j'ai pu envelopper ma tête autour de ce que fait le pivot, j'ai réalisé que cela a été fait de génial, et il ne le fait qu'avec une seule table.


( hochement de signe ) ( signe de tête ) .. jolie cool stuff .. seulement appris à ce sujet récemment moi-même.)


La solution est belle, mais saute des intervalles de saut. DT_FROM DT_TO Connexion TEMCINÉ TEMINDÉE Connecté 2010-02-05 19: 15: 00.000 2010-02-05 19: 30: 00.000 0 1 2 0 2010-02-05 19: 45: 00.000 2010 -02-05 20: 00: 00.000 0 3 6 0 2010-02-05 20: 00: 00.000 2010-02-05-02-05 20: 15: 00.000 0 4 5 0 2010-02-05 20: 30: 00.000 2010-02 -05 20: 45: 00.000 0 1 2 0


Oui @stefan, le code apportera des résultats basés sur les enregistrements réels qui existent ... pour des périodes sans enregistrements Aucun résultat n'est renvoyé. Je verrai si je peux la modifier pour inclure toutes les 0 périodes ..


@stefan, ajouté deuxième solution qui s'occupe des intervalles sans aucune valeur correspondante dans la base de données ..



0
votes

Une autre option ... xxx


0 commentaires

0
votes

Voici la version de la table Tally.

Configurez quelques données factices: P>

 select
    xx.FromTime
   ,sum(case when mt.Status = 'OK' then 1 else 0 end)     HowManyOk
   ,sum(case when mt.Status = 'Failed' then 1 else 0 end) HowManyFailed
  from (select
           dateadd(mi, (Number-1) * 10, @StartAt) FromTime
          ,dateadd(mi, Number * 10, @StartAt)     ThruTime
         from Tally where Number <= datediff(mi, @StartAt, @Through) /10) xx
   inner join MyTable mt
    on mt.MyDate >= xx.FromTime and mt.MyDate < xx.ThruTime
  group by xx.FromTime


1 commentaires

D'une base de référence très basique à l'intérieur du studio SQL SerRVer Management Studio ( Mettre le code dans une boucle et en prenant avant et après les heures ), la version que j'ai suggérée fonctionne sensiblement plus rapidement que le Tally One ..