Одна строка данных только для максимальной даты - транзакционный SQL - PullRequest
0 голосов
/ 06 июня 2011

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

SELECT DISTINCT                  
Cust.CustId,                      
LastDate=(Select Max(Convert(Date,TreatmentFieldHstry.TreatmentDateTime))   
          FROM TreatmentFieldHstry  
          WHERE Cust.CustSer = Course.CustSer  
          AND Course.CourseSer = Session.CourseSer 
          AND Session.SessionSer = TreatmentFieldHstry.SessionSer) 

Это дает несколько строк в зависимости от того, сколько дат - я просто хочу одну для максимума - может кто-нибудь помочь с этим?

Спасибо

1 Ответ

0 голосов
/ 06 июня 2011

Вы не указали, какую именно базу данных и версию используете, но если вы используете SQL Server 2005 или более новую версию, вы можете использовать что-то вроде этого (CTE с функцией ранжирования ROW_NUMBER) - I ' мы немного упростили это, так как я не знаю, какие еще таблицы есть у вас в select, которые никогда не отображаются ни в одном из списков столбцов SELECT .....

;WITH TopData AS
(
    SELECT c.CustId, t.TreatmentDateTime,
       ROW_NUMBER() OVER(PARTITION BY c.CustId ORDER BY t.TreatmentDateTime DESC) AS 'RowNum'
    FROM 
        dbo.TreatmentFieldHstry t
    INNER JOIN
        dbo.Customer c ON c.CustId = t.CustId  -- or whatever JOIN condition you have
    WHERE 
        c.CustSer = Course.CustSer  
 )
 SELECT
     *
 FROM
     TopData
 WHERE
     RowNum = 1

По сути, CTE (Common Table Expression) разбивает ваши данные на CustId и упорядочивает на TreatmentDateTime (по убыванию - сначала самое новое) - и нумерует каждую запись последовательным номером - для каждого "раздела" (например, для каждого новое значение CustId). При этом самая новая запись для каждого клиента имеет RowNum = 1, что я и использую, чтобы выбрать ее из этого CTE.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...