查询按group by子句获取多列

时间:2018-01-09 13:22:32

标签: sql oracle

我有一个表CR,其acc_id,cr_id,start_time为列

+-------+-------+----------+
| cr_id |acc_id |start_time|
+-------+-------+----------+
| 1     | 100   |12.30 am  |
| 2     | 200   | 1.30 am  |
| 3     | 300   |10.30 am  |
| 4     | 300   | 8.30 am  |
| 5     | 200   | 9.30 am  |
+-------+-------+----------+

我想获得acc_id和cr_id,它具有特定acc_id的最大start_time acc_id 200和300的上表的结果应为

+-------+-------+
| cr_id |acc_id |
+-------+-------+
| 5     | 200   |
| 3     | 300   |
+----+------+----

我尝试使用以下查询但是正在提供所有记录

SELECT ACC_ID 
  CR_ID
FROM  CR
WHERE START_TIME IN
  (SELECT MAX(START_tIME)
  FROM CR
  WHERE ACC_ID in (100,200)
  GROUP BY ACC_ID
  );

2 个答案:

答案 0 :(得分:0)

使用连接和子查询。假设start_timetimestamp数据类型。

SELECT CR.*
FROM  CR
(
    SELECT ACC_ID, MAX(start_time) max_start_time
    FROM CR
    WHERE ACC_ID in (100,200)
    GROUP BY ACC_ID
) t ON t.acc_id = cr.acc_id and
       t.max_start_time = cr.start_time

也可以将它解决为窗口函数,但是,此解决方案允许优化器使用索引better(如果它们可用)。

答案 1 :(得分:0)

我会这样写:

<script src='js/scripts.js'></script>

你的尝试非常接近。您缺少的行是检查主查询中的acc_id是否与子查询中的acc_id匹配。

更新:如果没有相同的acc_id多次返回,如果有多个记录具有最大开始时间,则可以使用MIN选择具有首先按字母顺序排列的cr_id的acc_id。