2012-05-02 11 views
7

は例えば、私はハイブで、このようなテーブルがあります。SQLでフィールドあたりの行数を制限する方法を教えてください。

1 1 
1 4 
1 8 
2 1 
2 5 
3 1 
3 2 

をし、私は、最初の列のそれぞれの固有の値の最初の2行を返すようにしたいです。私は、これを報告目的でHiveからMySQLに転送するデータの量を制限できるようにしたいと考えています。私にこれを与える単一のHiveQLクエリが欲しいです:

1 1 
1 4 
2 1 
2 5 
3 1 
3 2 
+1

でしょうか? – Matthew

+0

これらのテーブルと列に名前がありませんか? –

+1

このサイトを['best-n-per-group' + mysql'で検索してみてください(http://stackoverflow.com/questions/tagged/greatest-n-per-group+mysql?sort=votes&pagesize=50 )タグを組み合わせて、自分の状況に合った解決策が見つかるかどうかを確認してください。 –

答えて

6

Unluckily mysqlは分析関数を持っていません。だからあなたは変数で遊ぶ必要があります。 はあなたが自動インクリメントフィールドを持っていると仮定すると:

mysql> create table mytab (
    -> id int not null auto_increment primary key, 
    -> first_column int, 
    -> second_column int 
    ->) engine = myisam; 
Query OK, 0 rows affected (0.05 sec) 

mysql> insert into mytab (first_column,second_column) 
    -> values 
    -> (1,1),(1,4),(2,10),(3,4),(1,4),(2,5),(1,6); 
Query OK, 7 rows affected (0.00 sec) 
Records: 7 Duplicates: 0 Warnings: 0 

mysql> select * from mytab order by id; 
+----+--------------+---------------+ 
| id | first_column | second_column | 
+----+--------------+---------------+ 
| 1 |   1 |    1 | 
| 2 |   1 |    4 | 
| 3 |   2 |   10 | 
| 4 |   3 |    4 | 
| 5 |   1 |    4 | 
| 6 |   2 |    5 | 
| 7 |   1 |    6 | 
+----+--------------+---------------+ 
7 rows in set (0.00 sec) 

mysql> select 
    -> id, 
    -> first_column, 
    -> second_column, 
    -> row_num 
    -> from (
    -> select *, 
    -> @num := if(@first_column = first_column, @num:= @num + 1, 1) as row_num, 
    -> @first_column:=first_column as c 
    -> from mytab order by first_column,id) as t,(select @first_column:='',@num: 
=0) as r; 
+----+--------------+---------------+---------+ 
| id | first_column | second_column | row_num | 
+----+--------------+---------------+---------+ 
| 1 |   1 |    1 |  1 | 
| 2 |   1 |    4 |  2 | 
| 5 |   1 |    4 |  3 | 
| 7 |   1 |    6 |  4 | 
| 3 |   2 |   10 |  1 | 
| 6 |   2 |    5 |  2 | 
| 4 |   3 |    4 |  1 | 
+----+--------------+---------------+---------+ 
7 rows in set (0.00 sec) 

mysql> select 
    -> id, 
    -> first_column, 
    -> second_column, 
    -> row_num 
    -> from (
    -> select *, 
    -> @num := if(@first_column = first_column, @num:= @num + 1, 1) as row_num, 
    -> @first_column:=first_column as c 
    -> from mytab order by first_column,id) as t,(select @first_column:='',@num: 
=0) as r 
    -> having row_num<=2; 
+----+--------------+---------------+---------+ 
| id | first_column | second_column | row_num | 
+----+--------------+---------------+---------+ 
| 1 |   1 |    1 |  1 | 
| 2 |   1 |    4 |  2 | 
| 3 |   2 |   10 |  1 | 
| 6 |   2 |    5 |  2 | 
| 4 |   3 |    4 |  1 | 
+----+--------------+---------------+---------+ 
5 rows in set (0.02 sec) 
+0

1) 'ORDER BY'節なしでは動作しません。 2)「ORDER BY」列は、カウントする列でなければなりません。さもなければ、これは動作しません。 – Green

3

Aハイブのソリューションは、何によって発注

SELECT S.col1, S.col2 
FROM 
(SELECT col1, col2, row_number() over (partition by col1) as r FROM mytable) S 
WHERE S.r < 3 
関連する問題