Sql 使用聚合函数返回最小值
请帮助我创建一个查询,从下表中确定最短日期和时间:Sql 使用聚合函数返回最小值,sql,oracle,group-by,ora-00979,Sql,Oracle,Group By,Ora 00979,请帮助我创建一个查询,从下表中确定最短日期和时间: 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 |
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
如果使用聚合函数,则必须指定应为哪些字段应用aggregation。所以您使用的是GROUPBY子句。在这种情况下,您可能想为每个id、名称组合找到最短的日期和时间
select id, name, min(date_time)
from my_table group by id, name
尝试将所有其他列分组。。。如果表名为“table”,请尝试将表名更改为架构中的其他名称
SELECT ID , NAME , MIN(DATE_TIME) , LOCATION FROM TABLE GROUP BY ID, Name, Location
当您对某个内容进行分组时,所有其他行都将聚集到该分组键。对于键,只能在SELECT中获取一个rowentity 快捷方式是,任何分组都可以自由选择。否则,它们必须包含在聚合函数中 按id分组时 001键有4行聚集到它。。试想一下,当您在SELECT中指定非分组列时会发生什么。当你使用MINdate时。。在4个日期中,至少取一个 因此,您的查询必须是
SELECT ID,MIN(NAME),MIN(LOCATION),MIN(DATE)
FROM TABLE
GROUP BY ID
或
或
分析方法
不过,关于如何重新编写查询,这取决于需求
编辑:为了获取与最小日期对应的行,我们可以创建一个如下所示的自连接
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
或
选择t1.name、t1.id、t1.location、t1.date from select id、MINDate作为表组中的minu-date,通过id t2在t1.date=t2.minu-date和t1.id=t2.id上内部连接表t1 您的FROM子句在哪里?请在GROUPBY中包含名称,或从select列表中删除。位置也一样。是的,你是对的,我需要带位置字段的最小日期时间,名称,因此我只对id分组。@Nawaf更新了答案。这可能对你有帮助。
SELECT ID,LOCATION,DATE,MIN(DATE) OVER(PARTITION BY ID ORDER BY NULL) AS MIN_DATE
FROM TABLE.
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;