2015-04-24 3 views
0

Я использую функцию ROW_NUMBER в sql в разделе результирующего набора, где я хочу только первую строку в каждом разделе. Вот запрос:SQL Partition by

Select A, B, C, ROW_NUM 
FROM 
(SELECT A,B,C, ROW_NUMBER() OVER (PARTITION BY A ORDER BY C DESC) AS R0W_NUM 
FROM TABLE 
)X 
WHERE ROW_NUM = 1 

Это дает желаемые результаты.

Но вместо этого, теперь я использую функцию FIRST_VALUE следующим образом:

SELECT A,B,C, FIRST_VALUE(C) OVER (PARTITION BY A ORDER BY C DESC) AS ROW_NUM 
FROM TABLE 

Но приведенный выше запрос дает мне дублируют значения, а также. Может ли кто-нибудь вести меня о том, как мне избавиться от дубликатов? Я пробовал использовать DISTINCT, не помогает.

+3

Вы можете заменить все ваши 'A, B, C'' FIRST_VALUE () 'и повторять' OVER() 'предложения, чтобы получить тот же набор результатов, но зачем вам? Какова фактическая мотивация здесь, если 'ROW_NUMBER()' уже выполняет правильную работу? Или, если он не выполняет правильную работу, чего вы на самом деле пытаетесь достичь здесь? –

+0

Обязательно пометьте SQL-запросы соответствующим диалектом ('tsql', я верю?), Чтобы помочь специалистам в этом диалекте (так как существуют существенные различия между диалектами SQL). – Amadan

+0

Как насчет использования 'SELECT DISTINCT'? – user4759923

ответ

0

Использование FIRST_VALUE на C не будет избавиться от дубликатов А.

Если вы хотите избавиться от дубликатов А вы можете использовать один из следующих querys, в зависимости от роли Б.

Если B считается частью раздела, подобно

Select A, B, MAX(C) 
FROM TABLE 
GROUP BY A, B 

Если B содержит значение, которое может быть агрегированным (мин, макс, сумма ...), аналогичного с

Select A, MAX(B), MAX(C) 
FROM TABLE 
GROUP BY A 

Если B не похож на A (можно разделить на) или C (возможно для агрегации), я бы сохранил решение ROW_NUMBER(), которое вы включили в вопрос.

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