2015-06-16 2 views
0

Пожалуйста, помогите мне создать запрос для определения минимального date_time из приведенных ниже таблиц:Используя агрегатную функцию, чтобы вернуть минимальное значение

ID | Name | Date_Time | Location 
--------------------------------------- 
001 | John | 01/01/2015 | 901 
001 | john | 02/01/2015 | 903 
001 | john | 05/01/2015 | 905 
001 | john | 06/01/2015 | 904 
002 | Jack | 01/01/2015 | 903 
002 | Jack | 03/01/2015 | 904 
002 | Jack | 04/01/2015 | 905 
003 | Sam | 01/01/2015 | 904 
003 | Sam | 03/01/2015 | 903 
003 | Sam | 04/01/2015 | 901 
003 | Sam | 06/01/2015 | 903 

Я попробовал этот запрос:

SELECT ID, NAME, MIN(DATE_TIME), LOCATION 
    FROM TABLE 
GROUP BY (ID) 

, но я получил это сообщение об ошибке:

ORA-00979: not a GROUP BY expression 
+0

Где ваша статья 'FROM'? –

+1

Либо укажите имя в GROUP BY, либо удалите из списка выбора. То же самое для местоположения. – jarlh

ответ

1

Если вы используете функцию агрегации, вы указываете, для каких полей agr должно применяться. Таким образом, вы используете предложение group by. В этом случае вы, вероятно, хотите найти минимальное время даты для каждого идентификатора, комбинации имен.

select id, name, min(date_time) 
       from my_table group by id, name 
0

Попробуйте сгруппировать все другие столбцы ... и если таблица название «таблица» попробуйте изменить название таблицы на что-то другое в схеме.

SELECT ID , NAME , MIN(DATE_TIME) , LOCATION FROM TABLE GROUP BY ID, Name, Location 
1

Когда вы группируете что-то, все остальные строки будут оставлены кластеризованными для этого сгруппированного ключа. Для ключа вы можете получить только одну строку (сущность) в SELECT.

Ярлык есть, что-либо в GROUP BY может быть в SELECT свободно. В противном случае они должны быть заключены в функцию AGGREGATE.

При группировке по идентификатору,

001 ключ имеет 4 строки кластерные к нему .. Подумаешь, что произойдет, когда вы указываете, не сгруппированных в столбец SELECT. Где-то, когда вы используете MIN(date) .. из 4 дат берется минимум один.

Итак, ваш запрос должен быть

SELECT ID,MIN(NAME),MIN(LOCATION),MIN(DATE) 
FROM TABLE 
GROUP BY ID 

ИЛИ

SELECT ID,LOCATION,NAME,MIN(DATE) 
FROM TABLE 
GROUP BY ID,LOCATION,NAME 

ИЛИ

Аналитический подход.

SELECT ID,LOCATION,DATE,MIN(DATE) OVER(PARTITION BY ID ORDER BY NULL) AS MIN_DATE 
FROM TABLE. 

Тем не менее, это ДО требований, о том, как запрос должен быть переписан.

EDIT: Чтобы получить строки, соответствующие дате Min, мы можем создать SELF JOIN, как показано ниже.

SELECT T.ID,T.NAME,T.LOCATION,MIN_DATE 
FROM 
(
    SELECT ID,MIN(DATE) AS MIN_DATE 
    FROM TABLE T1 
    GROUP BY ID 
) AGG, TABLE T 
WHERE T.ID = AGG.ID 
AND T.DATE = AGG.MIN_DATE 

ИЛИ

SELECT ID,NAME,LOCATION,MIN_DATE 
FROM 
( 
    SELECT ID, 
     NAME, 
     LOCATION, 
     MIN(DATE) OVER(PARTITION BY ID ORDER BY NULL) MIN_DATE, 
     ROW_NUMBER() OVER(PARTITION BY ID ORDER BY NULL) RNK 
    FROM TABLE 
) 
WHERE RNK = 1; 
+0

Да, вы правы, мне нужно минимальное datetime с его полем местоположения, так что по этой причине я сгруппировал только id. – Nawaf

+0

@Nawaf Обновленный ответ. Это может вам помочь. –

0

выберите t1.name, t1.id, t1.location, t1.date из (выберите идентификатор, MIN (дата), как min_date из таблицы группы по идентификатору) t2 внутренняя присоедините TABLE t1 к t1.date = t2.min_date и t1.id = t2.id;

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