2016-08-25 1 views
1

Я пытаюсь получить максимальную дату и данные в своем отчете, но они все равно возвращают все записи за определенный промежуток времени, а не только последние данные о записи.TSQL различные Макс. Параметры даты не работают

имя таблицы dbo.vwPupil_EventType:

EventID (int,not null) 
PupilID (int,not null) 
EventDate (datetime,null) 
Header Note(text,null) 
Event Type (varchar(100),null) 
Module ID (int,null) 

первая попытка генерируется сообщение об ошибке Msg 306:

типы данных текста, NTEXT и изображения не могут быть сравнены

SELECT [Pupil ID], [Event Date],[Header Note], [Module ID], [Event ID] AS ID 
FROM  dbo.vwPupil_EventType EV 
WHERE ([Module ID] = 22) 
GROUP BY [Event ID],[Pupil ID], [Event Date],[Header Note],[Module ID] 
HAVING [Event Date]IN (SELECT MAX([Event Date]) 
         FROM  dbo.vwPupil_EventType 
         WHERE EV.[Event ID] = [Event ID]) 
ORDER BY [Pupil ID] 

Пробовал эти другие 2 варианта, но все равно получал все записи внутри е пролет, а не только последнего одного:

SELECT [Pupil ID], [Event Date], CAST([Header Note]AS VARCHAR(100))NOTE, [Module ID], [Event ID] AS ID 
FROM  dbo.vwPupil_EventType EV 
WHERE ([Module ID] = 22) 
GROUP BY [Event ID],[Pupil ID], [Event Date],CAST([Header Note]AS VARCHAR(100)),[Module ID] 
HAVING [Event Date]IN (SELECT MAX([Event Date]) 
         FROM  dbo.vwPupil_EventType 
         WHERE EV.[Event ID] = [Event ID]) 
ORDER BY [Pupil ID] 

затем попытался

SELECT [Pupil ID], MAX(CAST([Event Date] AS DATETIME)), CAST([Header Note]AS VARCHAR(100))NOTE, [Module ID], [Event ID] AS ID 
FROM  dbo.vwPupil_EventType EV 
WHERE ([Module ID] = 22) 
GROUP BY [Event ID],[Pupil ID], [Event Date],CAST([Header Note]AS VARCHAR(100)),[Module ID] 
HAVING [Event Date]IN (SELECT MAX([Event Date]) 
         FROM  dbo.vwPupil_EventType 
         WHERE EV.[Event ID] = [Event ID]) 
ORDER BY [Pupil ID] 
+0

Я думаю, нет необходимости, где положение в подпункте запроса, а также, если '[Дата события ] 'не находится в типе datetime, тогда он должен указывать в подзапросе, а также в том, что он имеет условие –

+0

привет JaydipJ, спасибо за ваш ответ, но ответ не очень помогает ... с тем, чтобы быть новым для sql, примером того, что он должен смотреть как бы помогло – newangie

ответ

0

Это, как правило, решается с помощью функции окна:

select [Pupil ID], [Event Date],[Header Note], [Module ID], [ID] 
from (
    SELECT [Pupil ID], [Event Date],[Header Note], [Module ID], [Event ID] AS ID, 
      row_number() over (partition by [Pupil ID] order by [Event Date] desc) as rn 
    FROM  dbo.vwPupil_EventType EV 
    WHERE [Module ID] = 22 
) t 
where rn = 1; 

Если имеется несколько строк с тем же " max date ", вы получите только один из них. Если вы хотите, чтобы все из них вернулись использование dense_rank() вместо row_number()

+0

привет, лошадь ... спасибо за предоставление вашего примера ... Я еще не работал с над разделом, но дам ему повод – newangie

+0

Здравствуйте, после используя ваш скрипт, теперь получите сообщение .... Msg 208, Level 16, State 1, Line 1 Неверное имя объекта 'dbo.vwPupil_EventType'. – newangie

+0

@newangie: тогда, видимо, у вас нет таблицы с именем 'dbo.vwPupil_EventType', несмотря на то, что вы заявили в своем вопросе –

0

Если я вас понял требование правильно они это может помочь вам

SELECT [Pupil ID], 
     [Event Date], 
     CAST([Header Note]AS VARCHAR(100)) NOTE, 
     [Module ID], 
     [Event ID] AS ID 
FROM  dbo.vwPupil_EventType EV 
WHERE [Module ID] = 22 
     AND CAST([Event Date] AS DATETIME) = (SELECT MAX(CAST([Event Date] AS DATETIME)) 
               FROM dbo.vwPupil_EventType) 
ORDER BY [Pupil ID] 

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

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