Разделение SQL по предложению

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

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, не помогает.


person Neha    schedule 24.04.2015    source источник
comment
Вы можете заменить все ваши A,B,C на FIRST_VALUE(<letter>) и повторяющиеся предложения OVER(), чтобы получить тот же набор результатов, но зачем вам это? Какова реальная мотивация, если ROW_NUMBER() уже выполняет правильную работу? Или, если он не выполняет правильную работу, чего вы на самом деле пытаетесь здесь достичь?   -  person Damien_The_Unbeliever    schedule 24.04.2015
comment
Обязательно помечайте вопросы SQL соответствующим диалектом (я полагаю, tsql?), чтобы люди, разбирающиеся в этом диалекте, могли помочь (поскольку между диалектами SQL существуют значительные различия).   -  person Amadan    schedule 24.04.2015
comment
Как насчет использования SELECT DISTINCT?   -  person user4759923    schedule 24.04.2015
comment
@Amadan: с чего ты взял, что это T-SQL? Пример показывает фактически стандартный ANSI SQL. Но я согласен, что вопрос должен быть помечен соответствующей СУБД   -  person a_horse_with_no_name    schedule 24.04.2015
comment
@a_horse_with_no_name: Признаю, это было слепое предположение.   -  person Amadan    schedule 24.04.2015
comment
если отдельные не работают, пожалуйста, поделитесь образцами данных, чтобы помочь.   -  person Deepshikha    schedule 24.04.2015


Ответы (1)


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

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

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

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

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

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

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

person Karin    schedule 24.04.2015