解答
230
SQL文(クエリ)
WITH yup AS ( SELECT user_id , EXTRACT(YEAR FROM date_time) AS year , product_id , SUM(revenue) AS sum_rev_yup FROM sample.sales GROUP BY year , user_id , product_id ) , yu AS ( SELECT EXTRACT(YEAR FROM date_time) AS year , user_id , SUM(revenue) AS sum_rev_yu FROM sample.sales GROUP BY year , user_id ) SELECT bsp.year , bsu.user_id , c.name , bsp.best_product_by_user , p.product_name AS best_product_name_by_user , sum_rev_by_user_product FROM ( SELECT year , user_id , MAX(best_sold_product) AS best_product_by_user , MAX(sum_rev_yup) AS sum_rev_by_user_product FROM ( SELECT user_id , year , FIRST_VALUE(product_id) OVER (PARTITION BY year, user_id ORDER BY sum_rev_yup DESC) AS best_sold_product , sum_rev_yup FROM yup ) GROUP BY year , user_id ) AS bsp JOIN ( SELECT * FROM ( SELECT year , user_id , RANK() OVER (PARTITION BY year ORDER BY sum_rev_yu DESC) AS rev_rank FROM yu ) WHERE rev_rank = 1 ) AS bsu USING (user_id, year) JOIN sample.products AS p ON bsp.best_product_by_user = p.product_id JOIN sample.customers AS c ON bsu.user_id = c.user_id
※最初のwith句の「yup」は[year][user_id][product_id]ごとの[sum_rev]を格納した仮想テーブルを、2番目の「yu」は[year][user_id]ごとの[sum_rev]を格納した仮想テーブルを表しています。