我想计算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
你的查询并不是你真正想做的,是吗,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
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