2016-03-03 3 views
1

У меня есть две таблицы, 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} 
+0

Не уверен, что вопрос здесь.Но почему вы используете DATEADD с литералом даты? Почему не только «2016-03-01»? –

+0

@SeanLange, где оператор возвращает все даты между 1 февраля 2016 года и 1 марта 2016 года. Работа выполняется в виде smalldatetime, и эта строка, на которую вы смотрите, выбирает все задания в феврале. Я просто использую dateadd для запуска этой даты до одного месяца. Это возвращает мне значения. – Cheddar

+0

@SeanLange вкратце Я мог бы изменить эту строку на tableA.job> = '2016-02-01' AND TableA.job <= '2016-03-01' – Cheddar

ответ

1

Как думать, как SQL Developer:

"Мне нужно тянуть LONGEST ..."

Переводит на:

"Мне нужен верхний 1, по заказу ..."

So somet повесят, как это:

SELECT TOP 1 tableA.Job, DateDiff(MINUTE, tableA.cutstart, tableB.end) as [total minute] 
From tableA 
left join tableB on 
tableA.Job = tableB.Job 
where {whatever conditions you want) 
ORDER BY DateDiff(MINUTE, tableA.cutstart, tableB.end) DESC 

EDIT: Если вы хотите, максимальное время выполнения для каждого задания, ответ еще проще думать.

У задания только одно конечное время, поэтому самый длинный пробег для каждого задания будет в зависимости от того, какая строка соединения в таблице A имеет самое раннее время начала.

Вот один из способов, чтобы получить, что (есть много):

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} 

Просто будьте осторожны поставить условия, касающиеся TableB в основном предложения WHERE и условия, относящиеся к TableA в подзапроса.

+0

Я пробовал делать select top 1, но он не работает, потому что он выбирает только первую позицию в моем запросе. В этой таблице много заданий. Каждое задание дублируется на количество машин, на которых выполнялась работа. Поэтому каждая работа может иметь от 3 до 5 разных машин на столе. Мне нужна самая длинная датировка для каждой работы. – Cheddar

+0

Я уточнил для получения большей ясности – Cheddar

+0

Отредактировал свой ответ на основе вашего разъяснения. –

 Смежные вопросы

  • Нет связанных вопросов^_^