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;