SQL max (DateTime) и фильтр категории без группы

Я написал следующий запрос:

SELECT DateTime, configId, rowId
FROM linkedTableDefinition a,
INNER JOIN tableDefinition b,
ON a.Target = b.Id
INNER JOIN ViewWithInfo c,
ON a.Target = c.Id

Это дает следующий результат:

DateTime configId rowId
12-09-2013 11:00 4 12
12-09-2013 12:00 4 12
12-09-2013 13:00 3 11
12-09-2013 12:00 3 11
12-09-2013 11:00 4 11

То, что мне нужно для этого вывода, следующее: для каждой комбинации rowId и configId мне нужно самое высокое значение из столбца datetime. Поэтому из приведенного выше примера я хочу получить следующий результат:

DateTime configId rowId
12-09-2013 12:00 4 12
12-09-2013 13:00 3 11
12-09-2013 11:00 4 11

Кто-нибудь знает ответ? Я хотел бы избежать GROUP BY, потому что оператор select будет расширен с большим количеством столбцов.

заранее спасибо

EDIT Текущий запрос:

SELECT testResults.ResultDate, testResults.ConfigurationId, TestResultsTestCaseId
FROM dbo.FactWorkItemLinkHistory workItemLink
INNER JOIN dbo.DimWorkItem workItem 
ON workItem.System_Id = workItemLink.TargetWorkItemID
INNER JOIN dbo.TestResultView testResults
ON testResults.TestCaseId = workItemLink.TargetWorkItemID
WHERE 
RemovedDate = convert(datetime, '9999-01-01 00:00:00.000')
AND workItemLink.SourceWorkItemID = 7
AND workItem.System_WorkItemType = 'Test Case'
3 ответа

SELECT *
FROM
(
 SELECT DateTime, configId, rowId, 
 ROW_NUMBER() OVER(PARTITION BY configId, rowId ORDER BY DateTime DESC) AS RowNum
 FROM linkedTableDefinition a
 INNER JOIN tableDefinition b ON a.Target = b.Id
 INNER JOIN ViewWithInfo c ON a.Target = c.Id
) src
WHERE src.RowNum = 1


Не знаю много о столбцах в вашей таблице, но это будет что-то вроде этого.... Запрос в CROSS APPLY, чтобы получить максимальную ТОП-1 дату для каждого результата, а затем подать в результирующий набор или внешний запрос.

SELECT configId, rowId, tbl.DateTime
 FROM linkedTableDefinition a,
 INNER JOIN tableDefinition b,
 ON a.Target = b.Id
 INNER JOIN ViewWithInfo c,
 ON a.Target = c.Id
 CROSS APPLY
 (
 SELECT TOP 1 DateTime
 FROM whatevertable
 WHERE whatevertable.CommonCol = TabeFrmOuterQuery.CommonCol
 ORDER BY DateTime DESC
 ) tbl


Вы можете сделать это, заменив соответствующие поля для соединения:

SELECT testResults.ResultDate, testResults.ConfigurationId, testResults.TestCaseId,
 (SELECT MAX(ResultDate) FROM dbo.TestResultView WHERE TestCaseId = testResults.TestCaseId AND ConfigurationId = testResults.ConfigurationId) AS MaxDate
FROM dbo.FactWorkItemLinkHistory workItemLink
INNER JOIN dbo.DimWorkItem workItem 
ON workItem.System_Id = workItemLink.TargetWorkItemID AND workItemLink.TeamProjectCollectionSK = workItem.TeamProjectCollectionSK
INNER JOIN dbo.TestResultView testResults
ON testResults.TestCaseId = workItemLink.TargetWorkItemID
WHERE 
RemovedDate = convert(datetime, '9999-01-01 00:00:00.000')
AND workItemLink.SourceWorkItemID = 7
AND workItem.System_WorkItemType = 'Test Case'
AND workItem.System_RevisedDate = convert(datetime, '9999-01-01 00:00:00.000')

licensed under cc by-sa 3.0 with attribution.