TOTAL_CHANGES

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

我想计算E-Mail地址每年的变化次数,请问如何计算?

WITH t AS (SELECT  1 as customer_id,'[email protected]' as email,2010 as year FROM DUAL
           UNION
            SELECT 1 as customer_id,'[email protected]' as email,2011 as year FROM DUAL
           UNION
           SELECT 2 as customer_id,'[email protected]' as email,2010 as year FROM DUAL
           UNION
           SELECT 3 as customer_id,'[email protected]' as email,2012 as year FROM DUAL
           UNION
           SELECT 3 as customer_id,'[email protected]' as email,2012 as year FROM DUAL
          ) 
        SELECT year, customer_id,email,
               LAG(email,1,0) OVER(ORDER BY email) as email_prev,
               sum(case when email <> LAG(sal, 1, 0) OVER (ORDER BY sal) then 1 else 0 end ) changes
          FROM t
;

ORA -30483: 窗口函数不允许在这里。

结果应该是。

Year  changes
====  =======
2010  1
2012  1
2018  20
oracle function lag
1个回答
1
投票

你的查询并不是你真正想做的,是吗,t CTE中没有SAL列,所以即使你处理了这个错误,查询也不会运行。试试这个查询。

WITH t AS (SELECT  1 as customer_id,'[email protected]' as email,2010 as year FROM DUAL
           UNION
            SELECT 1 as customer_id,'[email protected]' as email,2011 as year FROM DUAL
           UNION
           SELECT 2 as customer_id,'[email protected]' as email,2010 as year FROM DUAL
           UNION
           SELECT 3 as customer_id,'[email protected]' as email,2012 as year FROM DUAL
           UNION
           SELECT 3 as customer_id,'[email protected]' as email,2012 as year FROM DUAL
          ), 
t1 as (        SELECT year, customer_id,email,
               LAG(email,1) OVER(partition by customer_id ORDER BY email) as email_prev
       from t)
  select year,customer_id,
               sum(case when email <> email_prev or email_prev is null then 1 else 0 end ) changes
          FROM t1
group by year,customer_id;

这是输出结果

YEAR    CUSTOMER_ID CHANGES
2010    2               1
2010    1               1
2011    1               1
2012    3               2

0
投票
WITH t ( customer_id, email, year ) AS (
  SELECT 1,'[email protected]',  2010 FROM DUAL UNION ALL
  SELECT 1,'[email protected]',  2011 FROM DUAL UNION ALL
  SELECT 2,'[email protected]',  2010 FROM DUAL UNION ALL
  SELECT 3,'[email protected]',  2012 FROM DUAL UNION ALL
  SELECT 3,'[email protected]', 2012 FROM DUAL
)
SELECT year,
       COUNT(1) AS total_changes,
       COUNT( DISTINCT customer_id ) AS num_customers_changed_email
FROM   (
  SELECT year,
         customer_id,
         email,
         CASE email
         WHEN LAG( email, 1 ) OVER( PARTITION BY customer_id ORDER BY year )
         THEN 0
         ELSE 1
         END as has_changed_email
  FROM   t
)
WHERE has_changed_email = 1
GROUP BY year
ORDER BY year;

输出:

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