T SQL Мин. И Макс. Дата - PullRequest
       0

T SQL Мин. И Макс. Дата

0 голосов
/ 17 июня 2020

У меня есть таблица со столбцами DateTime, JobID, TaskID

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

Мне нужно написать запрос, который дает мне min (datetime) дочернего taskID 456 и max (datetime) родительского jobId 353, вывод должен выглядеть как

Startime                     Endtime
2020-05-16 06:43:12.297      2020-05-16 06:50:11:112

Это только для одного дня, т.е. 16 числа, аналогично мне нужны данные за одну неделю. Я попытался выполнить соединение в той же таблице

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

Это создает проблему из-за неправильного предложения group by, я также пробовал:

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

, но он говорит, что соединение неверно

Ответы [ 4 ]

0 голосов
/ 17 июня 2020

Мне удалось исправить это, изменив свой запрос, как показано ниже:

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
0 голосов
/ 17 июня 2020

Я думаю, вам также нужно сгруппировать по jobid в основном запросе, а затем добавить группу по полю из подзапроса, t1.JobLogDateTime - это поле, которое вы собираете, а не то, которое вы группируете, то же самое в подзапросе , если вы сделаете MIN (X), вы также не сможете GRUOP BY X. Попробуйте использовать это:

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

Я также удалил точку в конце 't1.JobID = mt1.jobid', подумайте это опечатка

РЕДАКТИРОВАТЬ: пара правок .. мой первый пост и формат не очень хороший :)

0 голосов
/ 17 июня 2020

Попробуйте это

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;
0 голосов
/ 17 июня 2020
SELECT 
    min( datetime ) OVER ( task_id )
    , max( datetime ) OVER ( task_id )
FROM 
    X
WHERE job_id = y
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...