Table de groupe dans les intervalles de 15 minutes
T-SQL, SQL Server 2008 et jusqu'
Donné un exemple de table de
StatusSetDateTime | UserID | Status | StatusEndDateTime | StatusDuration(in seconds)
============================================================================
2012-01-01 12:00:00 | myID | Available | 2012-01-01 13:00:00 | 3600
J'ai besoin de casser cela dans une vue qui utilise les intervalles de 15 minutes par exemple:
IntervalStart | UserID | Status | Duration
===========================================
2012-01-01 12:00:00 | myID | Available | 900
2012-01-01 12:15:00 | myID | Available | 900
2012-01-01 12:30:00 | myID | Available | 900
2012-01-01 12:45:00 | myID | Available | 900
2012-01-01 13:00:00 | myID | Available | 0
etc....
Maintenant, j'ai été en mesure de rechercher et de trouver quelques requêtes qui va briser
J'ai trouvé quelque chose de similaire pour MySql Ici :
Et quelque chose pour T-SQL Ici
Mais sur le deuxième exemple, ils sont en additionnant les résultats alors que j'ai besoin de diviser le total de la durée de l'intervalle de temps (900 secondes) par l'utilisateur par l'état.
J'ai été en mesure d'adapter les exemples dans le deuxième lien à couper le tout en intervalles, mais la durée totale est retourné et je ne peux pas comprendre comment faire pour obtenir l'Intervalle de périodes split (et encore la somme du total de la durée d'origine).
Merci d'avance pour toute perspicacité!
edit : Première Tentative
;with cte as
(select MIN(StatusDateTime) as MinDate
, MAX(StatusDateTime) as MaxDate
, convert(varchar(14),StatusDateTime, 120) as StartDate
, DATEPART(minute, StatusDateTime) /15 as GroupID
, UserID
, StatusKey
, avg(StateDuration) as AvgAmount
from AgentActivityLog
group by convert(varchar(14),StatusDateTime, 120)
, DATEPART(minute, StatusDateTime) /15
, Userid,StatusKey)
select dateadd(minute, 15*GroupID, CONVERT(datetime,StartDate+'00'))
as [Start Date]
, UserID, StatusKey, AvgAmount as [Average Amount]
from cte
edit : Deuxième Tentative
;With cte As
(Select DateAdd(minute
, 15 * (DateDiff(minute, '20000101', StatusDateTime) / 15)
, '20000101') As StatusDateTime
, userid, statuskey, StateDuration
From AgentActivityLog)
Select StatusDateTime, userid,statuskey,Avg(StateDuration)
From cte
Group By StatusDateTime,userid,statuskey;
Est-ce que votre premier intervalle de toujours commencer à l'heure de la StatusSetDateTime, ou est-il toujours en fonction :00, :15, :30, :45? À l'aide de votre exemple, si StatusSetDateTime est venu à 12:06:30, votre premier intervalle de commencer à 12;00:00 ou 12:06:30? Aussi, pouvez-vous poster le SQL vous avez jusqu'à présent pour le fractionnement?
Désolé je voulais mettre 0 dans la finale de l'intervalle de remercier pour la chasse. Les intervalles seront toujours 00, 15, 30, 45
Personnellement,
StatusEndDateTime
(vraiment?) est en exclusivité - le statut que vous avez à 13:00
est pas Available
, c'est autre chose (inconnu), voire rien). Il serait, après tout, suggèrent que vous êtes disponible pour un supplément de 15 minutes, ce qui ne peut être effectivement le cas.Désolé si je répète, il n'est pas clair: le StatusSetDatetime toujours fin :00, :15, h 30, ou :45? Sans aucune partie secondes? Et, êtes-vous SÛR d'inclure une ligne finale avec 0 durée? Quelle est la valeur ou de l'entreprise signifie un 0 durée de lignes?
OriginalL'auteur Wjdavis5 | 2012-11-30
Vous devez vous connecter pour publier un commentaire.
sql violon démo
oui, ok, c'est parce que j'ai ajouté un wrond durée - 1600, quand il devrait être 4500. Il semble que la durée de champ est redondant à tous, vous pouvez écrire à 900 au lieu de
A.StatusDuration / (count(*) over (partition by A.StatusSetDateTime, A.UserID, A.Status) - 1)
et de supprimer la durée de votre table 🙂 sqlfiddle.com/#!3/8c921/1J'ai aussi super simple solution pour vous en cas de différence entre le début et date de fin de la toujours 1 heure
Merci encore pour le travail sur ce, Mes durées ne sont pas toujours 1 heure c'était juste un exemple simple.
OriginalL'auteur Roman Pekar
Je n'ai jamais été à l'aise avec l'utilisation de la date de mathématiques de diviser les choses en partitions. Il semble que il ya toutes sortes de pièges à tomber.
Ce que je préfère faire est de créer un tableau (pré-définis, table de fonction, une variable de table) où il y a une ligne pour chaque date de la partition de gamme. La fonction table approche est particulièrement utile parce que vous pouvez construire pour arbitraire des plages et de la taille d'une partition que vous avez besoin. Ensuite, vous pouvez vous joindre à cette table de diviser les choses.
Je ne peux pas parler de la performance de cette méthode, mais je trouve que les requêtes sont beaucoup plus intuitive.
Chaque fois que quelqu'un édite un travail de projet de la mine, ils ont coupé 5% à 10% des mots. Si j'ai cru dans une vie antérieure, je crois que dans une vie antérieure, j'ai été payé par la parole. Forsooth.
J'espère que vous avez compris que j'ai été en profitant de la langue truc, ne cherche pas à critiquer radicalement. 🙂
OriginalL'auteur quillbreaker
Il est relativement simple si vous avez un assistant de tableau avec toutes les 15 minutes timestamp, qui vous vous JOIGNEZ à votre table de base par ENTRE. Vous pouvez construire la table d'assistance à la volée, ou de les garder en permanence dans votre base de données. Simple pour le gars à côté de votre société figure trop:
OriginalL'auteur ExactaBox
Vous pouvez utiliser un Expression de Table Commune récursive, où vous continuez à ajouter votre durée alors que le StatusEndDateTime est plus grande que la IntervalStart par exemple
OriginalL'auteur Matti John
Voici une requête qui va faire le travail pour vous, sans exiger helper tables. (Je n'ai rien contre helper tables, ils sont utiles et je les utilise. Il est également possible de ne pas les utiliser parfois.) Cette requête permet pour les activités de début et de fin, à tout moment, même si ce n'minutes se terminant en :00, :15, :30, :45. Si il y aura de la milliseconde parties, alors vous aurez à faire quelques tests parce que, à la suite de votre modèle, je ne suis allé à la deuxième résolution de l'.
Si vous êtes dur de la durée maximale, puis retirez @MaxDuration et de le remplacer avec cette valeur, en quelques minutes.
N <= @MaxDuration
est crucial pour la requête fonctionne bien.Ici est le script d'installation, si vous voulez l'essayer:
Aussi, voici une version qui s'attend à ce que des temps de minutes se terminant en :00, :15, h 30, ou :45.
Il semble vraiment comme avoir de la finale 0 Durée de la ligne n'est pas correcte, parce que vous ne pouvez pas il suffit de commander par IntervalStart comme il y a des doublons IntervalStart valeurs. Quel est l'avantage d'avoir des lignes à ajouter 0 au total?
OriginalL'auteur ErikE