J'ai une table avec des colonnes DateTime, JobID, TaskID
SELECT FORMAT(jbl.JobLogDateTime, 'yyyy-MM-dd') AS mainrundate, child.starttime, MAX(joblogdatetime) FROM JobLog jbl INNER JOIN ( SELECT FORMAT(JobLogDateTime, 'yyyy-MM-dd') AS rundate, MIN(joblogdatetime) AS Starttime FROM JobLog WHERE TaskID=456 GROUP BY FORMAT(joblogdatetime, 'yyyy-MM-dd') ) child ON child.rundate=jbl.mainrundate GROUP BY child.starttime, FORMAT(jbl.JobLogDateTime, 'yyyy-MM-dd') ORDER BY FORMAT(jbl.JobLogDateTime, 'yyyy-MM-dd') desc
J'ai besoin d'écrire une requête qui me donne le min (datetime) de l'enfant taskID 456 et max (datetime) du parent jobId 353, la sortie doit ressembler à
select mt1.Starttime, MAX(t1.JobLogDateTime) AS Endtime from JobLog t1 inner join ( SELECT jobid, MIN(JobLogDateTime) AS Starttime FROM JobLog WHERE taskid=456 group by JobLogDateTime, jobid ) mt1 on t1.JobID=mt1.jobid GROUP BY t1.JobLogDateTime
C'est pour juste un jour, c'est-à-dire le 16, de même j'ai besoin de données d'une semaine. J'ai essayé de faire une jointure sur la même table
Startime Endtime 2020-05-16 06:43:12.297 2020-05-16 06:50:11:112
Cela crée un problème en raison d'une clause group by incorrect, j'ai également essayé:
DateTime JobID TaskID 2020-05-16 06:43:11.687 353 NULL 2020-05-16 06:45:11.687 353 123 2020-05-16 06:43:11.687 353 123 2020-05-16 06:43:12.297 353 456 2020-05-16 06:44:30.750 353 456 2020-05-16 06:44:30.750 353 456 2020-05-16 06:44:30.750 353 789 2020-05-16 06:45:05.000 353 789 2020-05-16 06:48:07.750 353 789 2020-05-16 06:49:01:110 353 011 2020-05-16 06:50:11:112 353 NULL
mais il dit que la jointure est incorrecte
4 Réponses :
SELECT min( datetime ) OVER ( task_id ) , max( datetime ) OVER ( task_id ) FROM X WHERE job_id = y
Je pense que vous devez également regrouper par jobid dans la requête principale, puis ajouter le groupe par le champ de la sous-requête, t1.JobLogDateTime est le champ que vous agrégez, pas celui que vous groupez, même chose dans la sous-requête, si vous faites MIN (X) vous ne pouvez pas également GRUOP BY X. Essayez d'utiliser ceci:
select t1.jobid, mt1.Starttime, MAX(t1.JobLogDateTime) AS Endtime from JobLog t1 inner join ( SELECT jobid, MIN(JobLogDateTime) AS Starttime FROM JobLog WHERE taskid=456 group by jobid ) mt1 on t1.JobID=mt1.jobid GROUP BY t1.jobid, mt1.StartTime
J'ai également supprimé le point à la fin de 't1.JobID = mt1.jobid', je pense que c'est une faute de frappe
EDIT: quelques modifications .. mon premier message et le format n'était pas très agréable :)
Essaye ça
WITH child AS (SELECT taskid, MIN(JobLogDateTime) AS Endtime FROM JobLog WHERE taskid = 456 GROUP BY taskid) SELECT MAX(j.JobLogDateTime) AS Startime, MIN(c.Endtime) AS Endtime FROM JobLog AS j JOIN child AS c ON j.TaskID = c.TaskID;
Cela pourrait fonctionner si des données étaient nécessaires pendant un jour, mais je recherche des heures de début et de fin pendant une semaine
ajoutez simplement les filtres "JobLogDateTime entre <date de début de recherche> et <date de recherche de fin>" à la clause WHERE dans les deux instructions SELECT
J'ai pu résoudre ce problème en modifiant ma requête comme ci-dessous:
SELECT FORMAT(jbl.JobLogDateTime, 'yyyy-MM-dd') AS JobRunDate, MIN(child.starttime) AS Startime, MAX(jbl.joblogdatetime) AS EndTime FROM JobLog jbl left JOIN ( SELECT joblogdatetime AS Starttime FROM JobLog WHERE TaskID=456 ) child ON child.Starttime=jbl.JobLogDateTime WHERE jobid=353 GROUP BY FORMAT(jbl.JobLogDateTime, 'yyyy-MM-dd') ORDER BY FORMAT(jbl.JobLogDateTime, 'yyyy-MM-dd') desc
N'utilisez pas
FORMAT()
pour ce style . UtilisezCONVERT(char(10), col_name, 120)
. Pour le regroupement et la commande, je préférerais mêmeCONVERT(date, col_name)
.