Верхние N отсортированных строк с помощью GROUP BY?

#hive #apache-spark-sql #hiveql #top-n

#улей #apache-spark-sql #hiveql #top-n

Вопрос:

У меня есть следующая transaction таблица:

 customer_id, category, product_id, score
 

Я группирую по customer_id и category для создания списка product_id-score пар карт:

 SELECT
    s.customer_id,    
    s.category,
    collect_list(s.pair) 
FROM
    (
        SELECT
            customer_id,
            category,
            map(product_id, score) AS pair
        FROM
            transaction
        WHERE
            score > {score_threshold}
    ) s 
GROUP BY
    s.customer_id,
    s.category
 

Теперь я хочу сделать еще один шаг вперед. Для каждой группы я хочу сохранить только верхние n пары, отсортированные по score (в порядке убывания).Я попробовал OVER (PARTITION BY...ORDER BY) by, у меня возникли проблемы.

Примечание: transaction таблица разделена на category

Спасибо

Ответ №1:

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

 SELECT
        s.customer_id,    
        s.category,
        collect_list(s.pair) 
    FROM
        (
            SELECT
                ROW_NUMBER() OVER (PARTITION BY customer_id, category ORDER BY score desc) as RowId 
                customer_id,
                category,
                map(product_id, score) AS pair
            FROM
                transaction
            WHERE
                score > {score_threshold}
        ) s 
        where s.RowId < n
    
    GROUP BY
        s.customer_id,
        s.category