2017-02-04 2 views
1

У меня есть таблица выглядит как:Лучшие н Граф по категории в Sqlite

user books 
a  aa 
a  ab 
a  ab 
a  ac 
a  ac 
a  ac 
b  aa 
b  aa 
b  aa 
b  ac 
c  aa 
c  aa 
c  ab 
c  ab 
c  ab 

Я хочу агрегированном поле, имеет счетчик Fo уникальных книг для каждого пользователя - и я хочу, чтобы показать верхние из них 2, в порядке убывания, то есть:

user book count 
a  ac  3 
a  ab  2 
b  aa  3 
b  ac  1 
c  ab  3 
c  aa  2 

Я использую sqlite.

В postgres Я бы вам переделал, но я не думаю, что есть эквивалент в sqllite. Любое предложение?

ответ

1

Попробуйте это:

Select user, book, count(*) cnt 
From t a 
Where book in (
    Select book 
    From t b 
    Where a.user = b.user 
    Group by book 
    Order by count(*) desc 
    Limit 2 
) 
Group by user, book; 
1

Это настоящая боль в SQLite, поскольку она не имеет ни переменных, ни оконных функций. Одним из способов являются коррелированными подзапросами:

with ub as (
     select user, book, count(*) as cnt 
     from t 
     group by user, book 
    ) 
select ub.* 
from ub 
where ub.book in (select ub2.book 
        from ub ub2 
        where ub2.user = ub.user 
        order by cnt desc 
        limit 2 
       ); 

Примечания: Если есть связи, это произвольное выбирает два из них.

+0

это не работает при подключении к объекту запроса в: https://github.com/yhat/pandasql – xxxvinxxx

+0

А что это ошибка? –