2016-03-22 5 views
0

Я новичок в написании запросов MS SQL, и я пытаюсь отобразить только запись с самым высоким полем с именем RecordVersion. Ниже приводится запрос, который работает, но отображает все записи:Как отображать только результаты MAX по запросу

SELECT   
    PriceCalendars.PriceProgramID, 
    PriceCalendars.EffectiveDateTime, 
    PriceSchedules.Price, 
    PriceSchedules.PLU, 
    items.Descr, 
    PriceSchedules.LastUpdate, 
    PriceSchedules.LastUpdatedBy, 
    PriceSchedules.RecordVersion, 
    PriceSchedules.PriceScheduleUniqueID 
FROM    
    PriceCalendars 
    INNER JOIN PriceSchedules ON PriceCalendars.PriceProgramID = PriceSchedules.PriceProgramID 
    INNER JOIN items ON PriceSchedules.PLU = items.PLU 
WHERE   
    (PriceSchedules.PLU = 'SLS10100103') 
    AND (PriceCalendars.EffectiveDateTime = '2016-03-22') 

Вот результаты запроса:

PriceProgramID EffectiveDateTime Price PLU Descr LastUpdate LastUpdatedBy RecordVersion PriceScheduleUniqueID 

1 2016-03-22 00:00:00.000 35.00 SLS10100103    Architecture Adult from NP POS 2015-01-22 07:53:15.000 GX70,83  9 569 

1 2016-03-22 00:00:00.000 32.00 SLS10100103    Architecture Adult from NP POS 2014-02-25 16:22:46.000 GX70,83  5 86180 

Первая строка результатов имеет RecordVersion быть 9 и результаты второй линии составляет 5, Мне нужно только отображать более высокую запись, то, что вернуло RecordVersion = 9.

Каждый раз, когда я пытаюсь использовать команду MAX, я получаю ошибки или группу, и я пробовал каждый пример, который я мог найти в Интернете, но ничего похоже работа.

Использование MS SQL 2012. Спасибо, Кен

+1

выглядит как дубликат ел. Я видел много из этого случая. http://stackoverflow.com/questions/28984670/how-to-get-latest-record-or-record-with-max-corresponding-date-of-all-distinct-v – FLICKER

+0

Что делает два одинаковым, так что вам просто нужен один из них? PriceProgramID, PLU Descr, PriceScheduleUniqueID (или любая их комбинация)? – Ralph

+0

Вы пытались использовать 'SELECT TOP 1' и' ORDER BY RecordVersion DESC'? Этого может быть достаточно для вашего случая использования, но я не уверен. –

ответ

1

Попробуйте следующий запрос, который пытается решить проблему путем упорядочения возвращаемых строк по RecordVersion DESC, а затем выбирает только первую строку.

SELECT TOP 1  
    PriceCalendars.PriceProgramID, 
    PriceCalendars.EffectiveDateTime, 
    PriceSchedules.Price, 
    PriceSchedules.PLU, 
    items.Descr, 
    PriceSchedules.LastUpdate, 
    PriceSchedules.LastUpdatedBy, 
    PriceSchedules.RecordVersion, 
    PriceSchedules.PriceScheduleUniqueID 
FROM    
    PriceCalendars 
    INNER JOIN PriceSchedules ON PriceCalendars.PriceProgramID = PriceSchedules.PriceProgramID 
    INNER JOIN items ON PriceSchedules.PLU = items.PLU 
WHERE   
    (PriceSchedules.PLU = 'SLS10100103') 
    AND (PriceCalendars.EffectiveDateTime = '2016-03-22') 
ORDER BY 
    RecordVersion DESC 
+0

Спасибо, что сработало отлично. –

+0

Добро пожаловать в StackOverflow! Если вы пометите мой ответ как «принятый», вы получите еще две точки репутации для себя. #SOReadyToHelp –

0

Всех группы по столбцам должны быть в выберите, это правило группы by.How группы работ для каждой отдельной комбинации группы по столбцам, организовать оставшиеся столбцы в группы, так что любая агрегация может быть применена , в вашем случае я не уверен, какая группа по столбцам уникальна с датой тестирования. Существует одна версия, которая использует номер строки, которая дает желаемый результат

Помните, что заказ на последнюю обновленную дату - это тот, который решает строки порядок и присвоение номеров

WITH CTE 
AS 
( 
    SELECT PriceCalendars.PriceProgramID, 
    PriceCalendars.EffectiveDateTime, 
    PriceSchedules.Price, 
    PriceSchedules.PLU, 
    items.Descr, 
    PriceSchedules.LastUpdate, 
    PriceSchedules.LastUpdatedBy, 
    PriceSchedules.RecordVersion, 
    PriceSchedules.PriceScheduleUniqueID, 
    ROW_NUMBER() OVER (PARTITION BY PriceSchedules.RecordVersion ORDER BY PriceSchedules.LastUpdatedBy) AS RN 
FROM    
    PriceCalendars 
    INNER JOIN PriceSchedules ON PriceCalendars.PriceProgramID = PriceSchedules.PriceProgramID 
    INNER JOIN items ON PriceSchedules.PLU = items.PLU 
WHERE   
    (PriceSchedules.PLU = 'SLS10100103') 
    AND (PriceCalendars.EffectiveDateTime = '2016-03-22') 
    ) 
    SELECT * FROM CTE WHERE RN=1 
+0

Не уверен, но я думаю, что «PARTITION BY» в вашем запросе «хочет» использовать столбец «PriceProgramID», а не «RecordVersion». –

+0

Может быть, я не уверен, я думал, что рекордная версия уникальна, лучший способ получить больше ответов - предоставить некоторые тестовые данные и ожидаемый результат вместе с запросом до сих пор. – TheGameiswar

+0

Спасибо, но этот запрос по-прежнему отображает две строки данных, и мы требуется ответ из запроса только одной строки. Спасибо за помощь. –

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