Агрегированные строки на основе флага MIN - PullRequest
1 голос
/ 24 октября 2019

Я думаю, что это легко, но ответ ускользает от меня.

Пример: у меня есть запрос, возвращающий 10 строк, некоторые из которых идентичны, за исключением двух последних столбцов, которые являются комментарий и число ( language-flag ). Я хотел бы знать, как всегда возвращать строку с самым низким номером языкового флага для каждой из этих полуидентичных строк.

Я предполагал, что идея будет в MIN (language-flag), однакоэтот процесс группировки требует, чтобы запрос по-прежнему возвращал 2 строки, поскольку содержимое комментариев различается.

Образец изображения, который я создал, находится здесь:

Example

Любая помощь приветствуется.

Последующий вопрос:

В суматохе я забыл, почему мне первоначально нужно было задать этот вопрос.

Если поле комментариевбывает нулевым, когда есть тот же COL2 с более высоким флагом lang, тогда это должна быть выбранная строка, если нет более высокой строки флага lang и поле комментариев равно нулю, тогда должна быть выбрана только строка нулевых комментариев.

Я создал еще один пример изображения для этого случая:

enter image description here

Ответы [ 3 ]

2 голосов
/ 24 октября 2019

использовать связанный подзапрос

select a.* from table_name a
where a.lang_flag=(select min(lang_flag) from table_name b 
                          where a.comments=b.comments and a.col2=b.col2)
2 голосов
/ 24 октября 2019

В Oracle вы также можете использовать group by:

select min(comments) keep (dense_rank first order by lang_flag) as comments,
       col1, col2,
       min(lang_flag) as lang_flag
from t
group by col1, col2;

Если у вас большой объем данных, может быть интересно посмотреть, какой из трех предложенных методов самый быстрый.

2 голосов
/ 24 октября 2019

Вы можете использовать rank() для ранжирования записей по lang_flag в группах записей с одинаковым (col1, col2), а затем отфильтровать по верхней записи по группе:

select col1, col2, comments, lang_flag
from (
    select 
        t.*,
        rank() over(partition by col1, col2 order by lang_flag) rn
    from mytable t
) x
where rn = 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...