1

我有一个这样的数据块:

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 列标识),像这样?

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 

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

我不需要聚合函数(COUNT,SUM等),只需要一个列表,每个项目一次。A 列中每个值的出现次数各不相同,所以我不能只抓取每个x行。

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

4

2 回答 2

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
于 2013-03-07T18:21:24.513 回答
0

这个也试试。。

select * from table where rowid in (select min(rowid) from table group by a);
于 2013-03-08T05:27:04.833 回答