2012-05-02 15 views
7

उदाहरण के लिए, मैं हाइव में इस तरह एक मेज है:मैं SQL में फ़ील्ड मान प्रति पंक्तियों की संख्या को कैसे सीमित करूं?

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

और मैं केवल पहले कॉलम के प्रत्येक अनन्य मान के पहले दो पंक्तियों को वापस करना चाहते हैं। मैं चाहता हूं कि यह रिपोर्टिंग उद्देश्यों के लिए हाइव से MySQL में स्थानांतरित डेटा की मात्रा को सीमित करने में सक्षम हो। मुझे एक एकल HiveQL क्वेरी चाहिए जो मुझे यह देता है:

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

क्या ने आदेश दिया? – Matthew

+0

इन टेबल और कॉलमैन के नाम नहीं हैं? –

+1

इस साइट को ['महान-एन-प्रति-समूह '+' mysql'] द्वारा खोज करने का प्रयास करें (http://stackoverflow.com/questions/tagged/greatest-n-per-group+mysql?sort=votes&pagesize=50) टैग संयोजन और देखें कि क्या आप एक समाधान ढूंढ सकते हैं जो आपकी स्थिति को फिट करता है। –

उत्तर

6

अनजाने में mysql में विश्लेषणात्मक कार्य नहीं हैं। तो आपको चर के साथ खेलना है। जाना चाहिए तुम्हें एक 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) 'ORDER BY' खंड के बिना काम नहीं करता है। 2) 'ऑर्डर द्वारा' कॉलम एक कॉलम होना चाहिए जिसे आप गिनते हैं। अन्यथा यह काम नहीं करता है। – Green

3

एक हाइव समाधान होगा

SELECT S.col1, S.col2 
FROM 
(SELECT col1, col2, row_number() over (partition by col1) as r FROM mytable) S 
WHERE S.r < 3 
संबंधित मुद्दे

 संबंधित मुद्दे