복붙노트

[SQL] 어떻게 SQL에서 필드 값 당 행의 수를 제한 할 수 있습니까?

SQL

어떻게 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. ==============================

    1.불행하게도 MySQL은 분석 기능이 없습니다. 그래서 당신은 변수를 재생해야합니다. 당신이 자동 증가 필드가 가정하면 :

    불행하게도 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)
    
  2. ==============================

    2.하이브 솔루션이 될 것입니다

    하이브 솔루션이 될 것입니다

    SELECT S.col1, S.col2
    FROM
     (SELECT col1, col2, row_number() over (partition by col1) as r FROM mytable) S
    WHERE S.r < 3
    
  3. from https://stackoverflow.com/questions/10421807/how-do-i-limit-the-number-of-rows-per-field-value-in-sql by cc-by-sa and MIT license