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
4

4 回答 4

1

如果您使用聚合函数,则您已指定应应用聚合的字段。因此,您正在使用 group by 子句。在这种情况下,您可能的意思是找到每个 id、name 组合的最小 date_time。

 select id, name, min(date_time) 
              from my_table group by id, name
于 2015-06-16T11:04:59.347 回答
1

当您对某些内容进行分组时,所有其他行都将聚集到该分组键。对于一个键,您只能获取SELECT.

捷径是,任何在的东西都GROUP BY可以SELECT自由地进入。否则,它们必须包含在一个AGGREGATE函数中。

当你按 id 分组时,

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.

尽管如此,如何重写查询仍取决于要求。

编辑:要获取与最小日期相对应的行,我们可以创建一个如下所示的 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;
于 2015-06-16T11:08:32.227 回答
0

尝试将所有其他列分组......如果表名为“表”,请尝试将表名更改为架构中的其他名称。

SELECT ID , NAME , MIN(DATE_TIME) , LOCATION FROM TABLE  GROUP BY ID, Name, Location
于 2015-06-16T11:05:25.277 回答
0

select t1.name,t1.id,t1.location,t1.date from (select id,MIN(Date) as min_date from table group by id) t2 inner join TABLE t1 on t1.date=t2.min_date and t1.id =t2.id;

于 2015-06-16T13:25:36.797 回答