仅返回相关组中的第一个项目

时间:2013-03-07 18:18:00

标签: sql oracle

我有一个这样的数据块:

RW |  PK   A    B    C    D
============================
1  |  1    aa   123  x    99
2  |  2    aa   234  v    98
3  |  3    bb   321  z    11
4  |  4    bb   210  w    91
5  |  5    cc   456  y    55 

我怎样才能抓住每一组中的第一项(A栏ID),就像这样?

RW |  A    B    C    D
=======================
1  |  aa   123  x    99
2  |  bb   321  z    11
3  |  cc   456  y    55 

我可以GROUP BY或使用DISTINCT,但这与我正在查看的内容效率非常低,而运行直接列表的时间不到100毫秒。上述两个选项也可能在A列中产生多个项目实例,因为相关值可能不同。

换句话说,

SELECT MYTABLE.A, MYTABLE.D, MYTABLE.D, MYTABLE.D 
FROM MYTABLE 

非常快(不到一秒钟),而

SELECT MYTABLE.A, MYTABLE.D, MYTABLE.D, MYTABLE.D 
FROM MYTABLE
GROUP BY MYTABLE.A, MYTABLE.D, MYTABLE.D, MYTABLE.D

SELECT DISTINCT MYTABLE.A, MYTABLE.D, MYTABLE.D, MYTABLE.D 
FROM MYTABLE 

需要更长的时间(分钟,但我没有让它完成)。

我不需要汇总功能(COUNTSUM等),只需一个列表,每个项目一次。 A列中每个值的出现次数各不相同,因此我不能只抓住每个 x 行。

为什么我不运行列表并使用Excel或类似的东西进行排序?我正在查看要返回的几百万条记录,而我无法处理许多记录使用我熟悉的任何软件。

2 个答案:

答案 0 :(得分:4)

听起来你想要像

这样的东西
SELECT pk,
       a,
       b,
       c,
       d
  FROM( SELECT pk,
               a,
               b,
               c,
               d,
               row_number() over (partition by a order by pk asc) rnk
          FROM your_table )
 WHERE rnk = 1

答案 1 :(得分:0)

试试这个..

select * from table where rowid in (select min(rowid) from table group by a);