从Oracle SQL返回每个组的第一行

时间:2018-08-15 14:15:05

标签: oracle oracle11g

您好,我需要提出一个查询,该查询可以有效地返回每个组一个记录(我可能认为这是错误的),并在找到一个记录后立即停止在该组中搜索更多记录。

这是我的桌子:

|col1 | col2|
|-----|-----|
| A   |  1  |
| A   |  2  |
| B   |  3  |
| B   |  4  |

我想回来。

|col1 | col2|
|-----|-----|
| A   |  1  |
| B   |  3  |

请注意,我实际上并不关心第一行中是否有A1A2(同样适用于第二行)。 我想要获得的第一列中有A的一条记录可以是与该条件匹配的任何记录,并且类似地,我想要col1中具有B的一条记录。

我知道要关闭的结果是两个查询

SELECT col1, MIN(col2)
FROM tablename
GROUP BY col1

和另一个:

SELECT *
FROM tablename
WHERE col1 = 'A' 
    AND ROWNUM = 1

第一个查询还不够好,因为它将尝试查找A中具有col1的所有记录(在我要查看的实际表中,这意味着要搜索数百万行,指标在这里不会有太大帮助)。第二个查询一次将仅返回一个col1值,因此我必须运行数千次才能获取所需的所有记录。

注意:

我确实在这里看到了类似的问题,但是答案只集中在获得正确的查询结果上,我的问题是等待这些结果需要多长时间。

2 个答案:

答案 0 :(得分:1)

听起来像这样的查询:

select col1
     , min(col2) keep (dense_rank first order by rownum) col2
from tablename
group by col1;

答案 1 :(得分:0)

我感觉下面的查询正在快速返回结果。

 SELECT col1,col2 FROM (
        SELECT col1,col2, ROW_NUMBER () over (partition by col1 order by col2 asc) 
        minseq FROM tablename 
              --where rownum < 1000000000
        )
        where minseq = 1; 

常规查询

SELECT col1, MIN(col2)
FROM tablename
GROUP BY col1

花费1分钟从100000000条记录中提取500条记录,此查询耗时0.03秒