2015-07-16 5 views
1

Пожалуйста, взгляните на скрипт ниже.Выберите последнее значение строки для нескольких строк

http://sqlfiddle.com/#!6/26b91/1

Latest SQL Fiddle is here

Я попытаюсь описать выход я требую первый. Я ожидаю две строки, поскольку в таблице PullPointDate есть два условия. Несколько строк, которые находятся в таблице PullPoint, существуют из-за данных аудита, значения аудита начинаются от 1 до 3 для условия 1 и от 1 до 2 для условия 2. Как вы можете видеть, существует множество проверок данные. Другие столбцы в полном наборе данных, очевидно, меняются, но я не включил их здесь, поскольку они не актуальны. Излишне говорить, что они могут быть (n) условиями и связанными данными изменения аудита контрольной точки.

Колонна

CondNumber, StudyCode, PullPeriod, PullUnit 
1   , SS3105 , 52  , Weeks 
2   , SS3105 , 24  , Weeks 

Остальные строки в таблице PullPoint не должна фигурировать в результатах, поскольку они имеют более старую менее AuditNumber т.е. чем последняя AuditNumber.

Я довольно долго боролся с этим. Мой ум изо всех сил пытается мыслить на основе набора. Вложенная Row_Over, Partition By и т. Д., Я разрывается в холодных потах.

Как достичь этого, ближайший я мог бы получить, была одна строка, выглядящая идеально, но другое значение было нулевым из-за того, что я делал предложение where на номере аудита и из-за того, что оба условия были разными, были возвращены только одна строка данных ,

Спасибо

больше информации я постараюсь предоставить.

+0

Я поставил ссылку на последнюю скрипку из комментариев в вопрос и изменил теги вопрос , потому что вопрос связан с SQL-запросом, а не с инструментом SQL Fiddle. Измените ожидаемый результат в вопросе, чтобы он соответствовал последним образцам выборки. –

ответ

0

В дополнение к ответу Владимира Баранова вы также можете использовать CTE с row_number: SQLFiddler

WITH CTE 
AS 
(
SELECT ROW_NUMBER() OVER (PARTITION BY 
     P.BatchCode ORDER BY P.AuditNumber Desc) RN , 
     P.StudyCode , P.BatchCode , 
     PP.condNumber ,P.pullunit , P.PullPeriod 
      FROM pullpoint P 
      JOIN PullPointDate PP 
      ON P.BatchCode = PP.BatchCode 

) 

    SELECT StudyCode , 
      BatchCode , 
      condNumber , 
      pullunit , 
      PullPeriod 
FROM CTE 
WHERE RN = 1 
0

Это будет делать это:

fiddle here

+0

Надеюсь, что это не так просто, я уверен, что в моей структуре таблицы должно быть больше данных. Я добавил некоторые данные в одну из таблиц, и теперь больше результатов выливается больше, чем то, что они делали на работе. Мне жаль, что в первоначальном вопросе не было данных. Виноват. Я обновил скрипку. – Dilbert

+0

Я не думаю, что ваши дополнительные данные показываются в одной и той же скрипке. Я думаю, что ссылка на скрипку меняется, когда вы ее обновляете, так что вы можете опубликовать обновленную ссылку на скрипку? – AgapwIesu

+0

Эй, извини, дружище, Не могли бы вы еще раз взглянуть на меня. Кажется, я редактировал вашу публичную скрипку. Снова извините. – Dilbert

0

Это, кажется, чтобы дать мне то, что я желаю ...

ВЫБРАТЬ о * ОТ pullpoint о
LEFT JOIN pullpoint б.
ON o.studyCode = b.studyCode и o.batchCode = b.batchcode И o.aud itNumber < b.AuditNumber WHERE b.AuditNumber является NULL

Я уверен, что я получу работу завтра и вещь не будет работать, хотя :(

0

Для каждого BatchCode из PullPointDate мы ищем один ряд с PullPoint который имеет наибольший AuditNumber, используя CROSS APPLY. Вот SQL Fiddle. Я использовал ваш http://sqlfiddle.com/#!6/b1e79/2 в качестве источника данных образца.

Неясно, нужно ли присоединяться к двум таблицам на StudyCode. Если это необходимо, просто добавьте AND PullPoint.StudyCode = CTE.StudyCode в состояние WHERE.

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