2012-05-02 32 views
7

Ví dụ, tôi có một bảng như thế này trong Hive:Làm cách nào để giới hạn số hàng cho mỗi giá trị trường trong SQL?

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

và tôi muốn chỉ trả lại hai hàng đầu tiên của mỗi giá trị duy nhất của cột đầu tiên. Tôi muốn điều này để có thể giới hạn số lượng dữ liệu mà tôi chuyển từ Hive vào MySQL cho mục đích báo cáo. Tôi muốn có một truy vấn HiveQL đơn lẻ mang lại cho tôi điều này:

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

Ordered bởi những gì? – Matthew

+0

Không phải những bảng và columsn có tên? –

+1

Thử tìm kiếm trang này theo ['lớn nhất-n-mỗi-nhóm' +' mysql'] (http://stackoverflow.com/questions/tagged/greatest-n-per-group+mysql?sort=votes&pagesize=50) kết hợp thẻ và xem liệu bạn có thể tìm thấy giải pháp phù hợp với tình huống của mình hay không. –

Trả lời

6

Không có mysql chức năng phân tích. Vì vậy, bạn phải chơi với các biến. Giả sử bạn có một lĩnh vực autoincrement:

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) Không hoạt động nếu không có mệnh đề 'ORDER BY'. 2) cột 'ORDER BY' phải là cột bạn đếm. Nếu không, điều này không hoạt động. – Green

3

dung dịch A Hive sẽ

SELECT S.col1, S.col2 
FROM 
(SELECT col1, col2, row_number() over (partition by col1) as r FROM mytable) S 
WHERE S.r < 3 
Các vấn đề liên quan