2016-08-02 1 views
1

Я поставил данных в Microsoft SQL, который выглядит такПотянуть дополнительные данные, кроме сгруппированных данных

ID  Value1  Value2 
1   8   4 
1   4   2 
1   9   3 
1   3   1 
2   4   9 
2   5   7 
2   6   4 
2   7   5 
2   1   1 

Я пытаюсь вытащить только данные из соответствующей строки, содержащей максимальное значение в колонке 1, сгруппированных по Идентификационный номер. Результат должен быть следующим:

ID  Value1 Value2 
1  9   3 
2  7   5 

Следующее, что я пробовал, но безуспешно. Он работает, если Value2 удален.

USE [Database] 
SELECT [ID], 
     MAX([Value1]) as Value1, 
     [Value2] 
FROM [dbo].[Datatable] 
GROUP BY [ID] 
+0

вы могли бы использовать row_number() функции (раздел по ID заказа по value1 убыв), а затем выбрать только где номер строки = 1 – ZLK

+0

@ZLK Я довольно неопытный с SQL, не могли бы вы показать мне, как это будет выглядеть? – User247365

+0

так что 'select id, value1, value2 from (select id, value1, value2, row_number() over (partition by id order by value1 desc) rn from datatable) t где rn = 1' – ZLK

ответ

1

Функция ROW_NUMBER() окна может быть использована для разбиения таблицы по ID и ранжировать данные в пределах (от Value1 в порядке убывания, в данном случае).

DECLARE @DataTable TABLE (ID INT, Value1 INT, Value2 INT); 
INSERT @DataTable (ID, Value1, Value2) 
VALUES (1, 8, 4) 
    , (1, 4, 2) 
    , (1, 9, 3) 
    , (1, 3, 1) 
    , (2, 4, 9) 
    , (2, 5, 7) 
    , (2, 6, 4) 
    , (2, 7, 5) 
    , (2, 1, 1); 

SELECT ID, Value1, Value2 
FROM (
    SELECT ID, Value1, Value2, ROW_NUMBER() OVER (PARTITION BY ID ORDER BY Value1 DESC) RN 
    FROM @DataTable) T 
WHERE RN = 1; 

В качестве альтернативы, если есть возможные совпадения по максимальному значению Value1, используйте RANK() (или DENSE_RANK())

+0

. Я смущен относительно того, какая часть вашего решения вытягивает максимальное значение Value1, сгруппированное по ID? – User247365

+0

@ User247365 Предложение WHERE в конце делает это. RN - это псевдоним столбца, присвоенный функции ROW_NUMBER(), и вы хотите только первый для каждого идентификатора. Если вы выполняете оператор select внутри подзапроса ('SELECT ID, Value1, Value2, ROW_NUMBER() OVER (PARTITION BY ID ORDER BY Value1 DESC) RN FROM @ DataTable'), вы можете видеть, что он делает. EDIT: чтобы быть понятным, здесь не нужно использовать какое-либо выражение GROUP BY. – ZLK

+0

@ User247365 В случае, если он все еще запутан, функции окна применяются после того, как у вас есть набор результатов. Таким образом, подзапрос получает все данные, а затем применяет число к каждой из строк на основе того, как Value1 входит в число ID ... Затем внешний запрос только извлекает данные из строк с рангом 1. – ZLK

1

Вы пытались найти максимальное значение value2? Как этого

USE [Database] 
SELECT [ID], 
    MAX([Value1]) as Value1, 
    MAX([Value2]) as Value2 
FROM [dbo].[Datatable] 
GROUP BY [ID] 
+0

Я хочу, чтобы значение, соответствующее той же строки, что и max для value1, что не обязательно является самым высоким значением для value2 – User247365

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