Oracle SQL GROUP BY"不是GROUP BY表达式"的帮助

Yan*_*hon 14 sql oracle group-by

我有一个表some_table

+--------+----------+---------------------+-------+
| id     | other_id | date_value          | value |
+--------+----------+---------------------+-------+
| 1      | 1        | 2011-04-20 21:03:05 | 104   |
| 2      | 2        | 2011-04-20 21:03:04 | 229   |
| 3      | 3        | 2011-04-20 21:03:03 | 130   |
| 4      | 1        | 2011-04-20 21:02:09 | 97    |
| 5      | 2        | 2011-04-20 21:02:08 | 65    |
| 6      | 3        | 2011-04-20 21:02:07 | 101   |
| ...    | ...      | ...                 | ...   |
+--------+----------+---------------------+-------+
Run Code Online (Sandbox Code Playgroud)

我希望为最新的记录other_id 1,23.我想出的明显问题是

SELECT id, other_id, MAX(date_value), value
  FROM some_table 
 WHERE other_id IN (1, 2, 3) 
 GROUP BY other_id
Run Code Online (Sandbox Code Playgroud)

然而它吐出了一个not a GROUP BY expression"例外".我尝试添加的所有其他领域(例如id,value在中)GROUP BY条款,但只是返回的一切,就好像没有GROUP BY条款.(嗯,它也有意义.)

所以...我正在阅读Oracle SQL手册,我所能找到的只是一些例子,只涉及两列或三列的查询以及一些以前从未见过的分组函数.我该如何回归

+--------+----------+---------------------+-------+
| id     | other_id | date_value          | value |
+--------+----------+---------------------+-------+
| 1      | 1        | 2011-04-20 21:03:05 | 104   |
| 2      | 2        | 2011-04-20 21:03:04 | 229   |
| 3      | 3        | 2011-04-20 21:03:03 | 130   |
+--------+----------+---------------------+-------+
Run Code Online (Sandbox Code Playgroud)

(每个的最新条目other_id)?谢谢.

Mic*_*sov 15

 select id, other_id, date_value, value from
 (
   SELECT id, other_id, date_value, value, 
   ROW_NUMBER() OVER (partition by other_id order BY Date_Value desc) r
   FROM some_table 
   WHERE other_id IN (1, 2, 3) 
 )
 where r = 1
Run Code Online (Sandbox Code Playgroud)


Ben*_*oit 8

您不能选择任何既不是聚合也不能仅从GROUP BY子句中使用的列计算的列.

但是有三种方法可以做到:

  • 您可以使用分析函数

    SELECT id, other_id, date_value, value
      FROM ( SELECT id, other_id, date_value, MAX(date_value) OVER (partition by other_id) max_date, value
               FROM some_table )
     WHERE max_date = date_value;
    
    Run Code Online (Sandbox Code Playgroud)
  • 您可以使用带有"大于"子句的自联接,并以这种方式检测最大值

    SELECT t1.id, t1.other_id, t1.date_value, t1.value
      FROM some_table t1
      LEFT OUTER JOIN some_table t2
                   ON ( t1.other_id = t2.other_id AND t2.date_value > t1.date_value )
     WHERE t2.other_id IS NULL
    
    Run Code Online (Sandbox Code Playgroud)
  • 您可以使用子查询

      WITH max AS ( SELECT other_id, MAX(date_value) FROM some_table GROUP BY other_id )
    SELECT id, other_id, date_value, value
      FROM some_table
     WHERE ( other_id, date_value ) IN ( SELECT * FROM max )
    
    Run Code Online (Sandbox Code Playgroud)