2016-03-18 3 views
1

Давайте предположим, что у меня есть таблица с 3 столбцами:SQL Оракул Выберите условие в группе

ID | GroupId | DateCreatedOn | 

Я хочу, чтобы выбрать ДАННЫЕ сгруппированных по GroupID так:

select GroupId from tableName group by GroupId; 

Но что, если я хочу выполнить другой выбор в каждой группе? давайте теперь предположим, что мне нужна последняя созданная строка (DateCreatedOn) для каждой группы?

Кроме того, я хотел бы получить ВСЕ столбцы, а не только GroupId.

Im вид потерянного, потому что у меня есть только GroupId.

Просьба привести некоторое объяснение, а не только правильный запрос.

+0

Добавить некоторые данные таблицы образцов, и это ожидаемый результат. – jarlh

+0

Общий совет GROUP BY, выбранный столбец должен быть либо аргументом для функции набора (например, AVG), либо быть включенным в предложение group by. (Редко оба.) – jarlh

ответ

1

Вы можете использовать ROW_NUMBER для этого:

SELECT ID, GroupId, DateCreatedOn 
FROM (
    SELECT ID, GroupId, DateCreatedOn, 
     ROW_NUMBER() OVER (PARTITION BY GroupId 
          ORDER BY DateCreatedOn DESC) AS rn 
    FROM mytable) t 
WHERE t.rn = 1 

rn поле равно 1 для записи, имеющей самую последнюю DateCreatedOn значение в пределах каждого раздела GroupId.

+1

Я удалил свой комментарий, потому что сделал ошибку по моему запросу. Ваш запрос приводит меня к http://stackoverflow.com/questions/10477085/oracle-partition-by-and-row-number-keyword, где я могу найти отличное объяснение раздела. благодаря – Neb

1

Вы можете получить значение с максимумом другого столбца с использованием KEEP (DENSE_RANK [FIRST|LAST] ORDER BY ...) в агрегации:

SELECT GroupID, 
     MAX(ID) KEEP (DENSE_RANK LAST ORDER BY DateCreatedOn) AS id 
     MAX(DateCreatedOn) AS DateCreatedOn 
FROM  table_name 
GROUP BY GroupId 

Вы также можете сделать это с помощью ROW_NUMBER():

SELECT ID, 
     GroupID, 
     DateCreatedOn 
FROM (
    SELECT t.*, 
     ROW_NUMBER() OVER (PARTITION BY GroupID 
          ORDER BY DateCreatedOn DESC, ID DESC) AS RN 
    FROM table_name t 
) 
WHERE RN = 1 

(ID DESC добавляется к ORDER BY, чтобы получить максимум ID за последние DateCreatedOn, чтобы получить тот же результат, что и первый запрос, если у вас нет детерминированного порядка, тогда yo u, скорее всего, получит какую-либо строку, создаваемую базой данных, и результат может быть недетерминированным)

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