per - sql top 1 from each group
如何選擇每組的前N行? (2)
您可以使用相關的子查詢來進行計數:
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;
對於一個小型數據庫,這應該沒問題。 如果您在Book(AuthorId, BookId)
上創建一個複合索引Book(AuthorId, BookId)
那麼這將有助於查詢。
我有兩個這樣的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
我想做一個SELECT查詢,將返回每個AuthorId的前N(例如兩個)行,按標題排序(“選擇每個作者的前兩本書”)。
示例輸出:
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
我怎樣才能建立這個查詢?
(是的,我發現了一個類似的話題,而且我知道如何只返回一行(第一或最上面),問題在於兩者)。
還有另一種變體:
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