복붙노트

[SQL] 어떻게 각 그룹의 첫 번째 N 행을 선택하려면?

SQL

어떻게 각 그룹의 첫 번째 N 행을 선택하려면?

이 같은 두 SQLite는 테이블을 가지고 :

 AuthorId | AuthorName
----------------------
 1        | Alice
 2        | Bob
 3        | Carol
 ...      | ....


 BookId | AuthorId | Title
----------------------------------
 1      | 1        | aaa1
 2      | 1        | aaa2
 3      | 1        | aaa3
 4      | 2        | ddd1
 5      | 2        | ddd2
 ...    | ...      | ...
 19     | 3        | fff1
 20     | 3        | fff2
 21     | 3        | fff3
 22     | 3        | fff4

내가 처음 N 각 AuthorId, 제목에 의해 주문 (예를 들어, 2 개) 행을 반환하는 SELECT 쿼리를 만들고 싶어 ( "각 저자의 첫 두 권의 책을 선택").

샘플 출력 :

 BookId |  AuthorId | AuthorName | Title
------------------------------------------
 1      |  1        |   Alice    | aaa1
 2      |  1        |   Alice    | aaa1
 4      |  2        |   Bob      | ddd1
 5      |  2        |   Bob      | ddd2
 19     |  3        |   Carol    | fff1
 20     |  3        |   Carol    | fff2

어떻게이 쿼리를 만들 수 있습니까?

(예) 나는 유사한 주제를 발견하고, 나는 단지 하나의 행 (최초 또는 최고 반환하는 방법을 알고있다. 문제는 두 사람과 함께있다).

해결법

  1. ==============================

    1.당신은 상관 하위 쿼리를 사용하여 계산을 수행 할 수 있습니다 :

    당신은 상관 하위 쿼리를 사용하여 계산을 수행 할 수 있습니다 :

    SELECT b.BookId, a.AuthorId, a.AuthorName, b.Title
    FROM Author a join
         Book b
         on a.AuthorId = b.AuthorId
    where (select count(*)
           from book b2
           where b2.bookId <= b.BookId and b2.AuthorId = b.AuthorId
          ) <= 2;
    

    작은 데이터베이스에 대해이 잘되어야합니다. 당신이 도서 (AuthorId, bookID로서)에 복합 인덱스를 만드는 경우 해당 쿼리를 도움이 될 것입니다.

  2. ==============================

    2.다른 변형이 있습니다 :

    다른 변형이 있습니다 :

    SELECT * FROM (
        SELECT * FROM BOOK, AUTHOR
        WHERE BOOK.AUTHORID = AUTHOR.AUTHORID
    ) T1
    WHERE T1.BOOKID IN (
        SELECT T2.BOOKID FROM BOOK T2
        WHERE T2.AUTHORID = T1.AUTHORID
        ORDER BY T2.BOOKTITLE
        LIMIT 2
    )
    ORDER BY T1.BOOKTITLE
    
  3. ==============================

    3.여기 당신은 간다. 너무 늦을 수 있지만, 난 그냥 게시물을보고 있습니다. 당신은 <= 2는 당신이 필요로하는 N에 맞게 변경할 수 있습니다.

    여기 당신은 간다. 너무 늦을 수 있지만, 난 그냥 게시물을보고 있습니다. 당신은 <= 2는 당신이 필요로하는 N에 맞게 변경할 수 있습니다.

    SELECT 
     a.authorid,
     a.authorname,
     b.bookid,
     b.booktitle
    FROM author a
    JOIN book b ON b.authorid = b.authorid
    QUALIFY ROW_NUMBER() OVER (PARTITION BY a.authorid
    ORDER BY   b.booktitle ASC) <=2
    
  4. from https://stackoverflow.com/questions/17991943/how-to-select-the-first-n-rows-of-each-group by cc-by-sa and MIT license