按收入和年份对用户进行分组

问题描述 投票:0回答:1

我连续 2 年在“Group_3”中对用户进行分组时遇到问题。想法是将连续 2 年下订单收入超过 2000 的用户分组到第 3 组。

SELECT email_id,
       COUNT(*) as num_of_orders,
       SUM(revenue) AS total_money_spent,
       CASE WHEN 
                SUM(CASE WHEN order_creation_date BETWEEN '2016-01-01' and '2016-12-   31'
                THEN revenue END) > 2000
       THEN 'Group_1'
            WHEN 
                SUM(CASE WHEN order_creation_date BETWEEN '2015-01-01' and '2016-12-31'
                THEN revenue END) > 2000
       THEN 'Group_2'
            WHEN 
                SUM(CASE WHEN EXTRACT(years FROM order_creation_date) <> LAG(EXTRACT(years FROM order_creation_date)) 
                OVER(PARTITION BY email_id ORDER BY EXTRACT(years FROM order_creation_date)) + 1 
                THEN revenue END) > 2000
                THEN 'Group_3'
            WHEN 
                SUM(CASE WHEN order_creation_date BETWEEN '2015-01-01' and '2016-12-31'
                THEN revenue END) < 2000
       THEN 'Group_4'
            WHEN 
                SUM(CASE WHEN order_creation_date BETWEEN '2015-01-01' and '2016-12-31'
                THEN revenue END) = 0
       THEN 'Group_5'
         END
FROM sql_test
GROUP BY email_id
ORDER BY num_of_orders DESC;

我得到:

聚合函数调用不能包含窗口函数调用
第 13 行:...E WHEN EXTRACT(years FROM order_creation_date) <> LAG(EXTRAC..

我猜我不能在

LAG
查询中使用
CASE

sql postgresql aggregate-functions
1个回答
0
投票

窗口函数在 SELECT 语句中执行

after
聚合函数。您不能以相反的顺序嵌套它们。考虑事件的顺序:

改用子查询:

SELECT email_id,
       COUNT(*) as num_of_orders,
       SUM(revenue) AS total_money_spent,
       CASE WHEN 
                SUM(revenue) FILTER (WHERE order_creation_date BETWEEN '2016-01-01' and '2016-12-31') > 2000
                THEN 'Group_1'
            WHEN 
                SUM(revenue) FILTER (WHERE order_creation_date BETWEEN '2015-01-01' and '2016-12-31') > 2000
                THEN 'Group_2'
            WHEN 
                SUM(revenue) FILTER (WHERE EXTRACT(year FROM order_creation_date) <> last_year + 1) > 2000
                THEN 'Group_3'
            WHEN
                SUM(revenue) FILTER (WHERE order_creation_date BETWEEN '2015-01-01' and '2016-12-31') < 2000
                THEN 'Group_4'
            WHEN
                SUM(revenue) FILTER (WHERE order_creation_date BETWEEN '2015-01-01' and '2016-12-31') = 0
                THEN 'Group_5'
         END
FROM   (
   SELECT *, LAG(EXTRACT(year FROM order_creation_date)) OVER (PARTITION BY email_id ORDER BY EXTRACT(year FROM order_creation_date)) AS last_year
   FROM   sql_test
   ) sub
GROUP  BY email_id
ORDER  BY num_of_orders DESC;

在做的时候:总的

FILTER
表达式比那些
CASE
表达式更优雅、更快。参见:

© www.soinside.com 2019 - 2024. All rights reserved.