2013-10-06 1 views
0

я написал ниже запрос:SQL макс (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' 
+0

@JustinHui Единственное Я написал основную часть запроса, потому что иначе это будет очень специфично. СвязанныйTableDefinition содержит ссылки parentId. Элемент parentId передается через удаленную процедуру. Определение таблицы содержит информацию самого элемента и предназначено для фильтрации. В представлении содержатся данные в инструкции select. Все эти таблицы взяты из программного продукта, который уже был закуплен – mrtentje

ответ

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 
+0

Вы должны дать мне более подробную информацию. Какие строки не фильтруются? –

+0

Спасибо, что он почти работает. Единственное, что работает неправильно, - это фильтрация на configId. Комбинация configId и rowId должны быть уникальными, а из этой уникальной комбинации - самая высокая дата. – mrtentje

+0

@mrtentje: Затем вы должны заменить 'PARTITION BY rowId' на' PARTITION BY configId, rowId'. –

0

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

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') 
+0

. Спасибо, проблема в том, что результаты, которые не подходят, не фильтруются (я обновил свой вопрос с помощью моего текущего запроса, надеюсь, что это будет иметь больше смысла) – mrtentje

+0

Я обновил мой предложенный запрос, основанный на вашем недавнем редактировании. Если я правильно понял, вы хотите включить последний ResultDate из TestResultView для каждого TestCaseId, все еще имея строку для каждой комбинации ResultDate/ConfigurationId/TestCaseId. –

0

не знаю много о столбцах в вашем стол, но это было бы что-то вроде этого .... запрос в CROSS ОТНОСИТЬСЯ с получить максимальную дату TOP 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 
+0

Спасибо, проблема в том, что результаты, которые не подходят, не фильтруются (я обновил свой вопрос с помощью моего текущего запроса, надеюсь, что это будет иметь больше смысла) – mrtentje

+0

FROM dbo.FactWorkItemLinkHistory workItemLink INNER JOIN dbo.DimWorkItem workItem ON workItem. System_Id = workItemLink.TargetWorkItemID И workItemLink.TeamProjectCollectionSK = workItem.TeamProjectCollectionSK Почему вы соединяете таблицы на этих нескольких столбцах ??? –

+0

Этот SQL-запрос будет использоваться в хранимой процедуре. Родитель будет передан, и все дети будут извлечены. Эта информация хранится в FactWorkItemLinkHistory. Тип ребенка хранится в DimWorkItem.Чтобы каждый дочерний элемент был частью коллекции, есть соединение на нескольких столбцах – mrtentje

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