У меня есть две таблицы, TableA имеет столбцы: Job, Machine, CutStart, CutEnd. TableB имеет столбцы: job, Start, End. Таблица A имеет первичный ключ задания и машины. У TableB есть первичный ключ работы. По сути, tableB - это место, где собраны все материалы из нескольких компьютеров из таблицы A. Мне нужно вытащить БОЛЬШУЮ разницу во времени между tableA.CutStart и tableB.End. Поскольку существует несколько машин, связанных с одним заданием, я получаю несколько различий в минутах, связанных с каждым заданием, и мне нужно выбрать только самый большой. Вот мой код до сих пор. Кроме того, обратите внимание, что работа выполняется в виде smalldatetime. Существуют также некоторые другие различные инструкции для удаления плохих данных.Выберите только максимальную минуту DateDiff для повторяющихся строк, SQL
SELECT tableA.Job, DateDiff(MINUTE, tableA.cutstart, tableB.end) as 'total minute'
From tableA
left join tableB on
tableA.Job = tableB.Job
where tableA.Job >= '2016-02-01' AND tableA.Job <= (DATEADD(Month, 1, '2016-02-01'))
AND datediff(Minute, tableA.cutstart, tableB.end) < 17280 AND datediff(Minute, tableA.cutstart, tableB.End) > 20
group by tableA.Job, tableA.CutStart, tableB.End order by tableA.Job
Пример. В таблице А есть рабочие места A и B с 3 различными машинами на каждом из них с их собственной индивидуальной вырезкой и вырезанным концом. Таблица B имеет только задания A и B с одним запуском и завершением для каждого. Если вы запустите код выше, вы получите 6 результатов, и я хочу только 2. Результаты 2 - это разница во времени с наибольшим разрывом между tableA.cutstart и tableB.end.
-------------- UPDATE -----------
TableA
Job Machine CutStart CutEnd
A 5 2016-02-03 08:56 2016-02-03 10:50
A 6 2016-02-03 07:32 2016-02-03 9:42
A 7 2016-02-03 09:12 2016-02-03 11:15
B 5 2016-02-03 08:56 2016-02-03 10:50
B 6 2016-02-03 08:56 2016-02-03 10:50
B 7 2016-02-03 08:56 2016-02-03 10:50
TableB
Job Start End
A 2016-02-03 13:53 2016-02-03 15:32
B 2016-02-03 13:53 2016-02-03 15:32
Текущие результаты
Job "Minute difference"
A 54
A 112
A 96
B 154
B 93
B 217
Прошлые результаты
Job "Minute difference"
A 112
B 217
Я только хочу выбрать самую длинную менуетную разницу для каждого задания. Кроме того, цифры не складываются, они просто держатели места.
---------------------- Окончательное решение ------------------
SELECT tableB.Job, DateDiff(MINUTE, (
SELECT MIN(tableA.cutstart)
FROM tableA
WHERE tableA.Job=tableB.Job
), tableB.end) as [total minute]
From tableB
where {whatever conditions you want}
Не уверен, что вопрос здесь.Но почему вы используете DATEADD с литералом даты? Почему не только «2016-03-01»? –
@SeanLange, где оператор возвращает все даты между 1 февраля 2016 года и 1 марта 2016 года. Работа выполняется в виде smalldatetime, и эта строка, на которую вы смотрите, выбирает все задания в феврале. Я просто использую dateadd для запуска этой даты до одного месяца. Это возвращает мне значения. – Cheddar
@SeanLange вкратце Я мог бы изменить эту строку на tableA.job> = '2016-02-01' AND TableA.job <= '2016-03-01' – Cheddar