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 で 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ミリ秒もかかりません. 前述の 2 つのオプションは、関連する値が異なる可能性があるため、列 A のアイテムの複数のインスタンスを生成することもあります。

言い換えると、

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

非常に高速 (1 秒未満) ですが、

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など) は必要ありません。アイテムごとに 1 回のリストだけです。列 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 に答える