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
,2
和3
.我想出的明显问题是
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)
您不能选择任何既不是聚合也不能仅从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) 归档时间: |
|
查看次数: |
57216 次 |
最近记录: |