我有一个带有日期的数据集,并且每个日期附加了一些值。我正在跨帐户汇总信息,并按帐户和活跃天数进行分组。我想知道帐户的平均行为。我不关心DATE,我关心DAYS ACTIVE,所以这就是我的问题发生的地方。我尝试创建一个计算字段(num_days),对于每个帐户,它是自首次进入系统以来的天数。
SELECT Acct_ID, L_Type, Num_License, Num_Active, Q_Date - MIN(Q_Date) as Num_days
FROM s.Table
WHERE flag = 'N'
GROUP BY Acct_ID, Num_days
这给了我错误"无效的标识符"
我一直在阅读,只是在小组中再次使用计算,所以我尝试了
GROUP BY Acct_ID, Q_Date - MIN(Q_Date)
这会产生错误"此处不允许使用群组功能"
如何按天数进行分组?谢谢!
答案 0 :(得分:2)
我正在使用SQL服务器,但我认为这个版本在Oracle中也可以使用,除非它是一个非常旧的版本。
基本上我认为你应该先分析你的查询,先计算MIN,然后将结果与原始表联合起来。
WITH CTE as
(
SELECT Acct_ID, MIN(Q_Date) as Q_Date
from s.Table
Group by Acct_ID
)
SELECT RT.Acct_ID, RT.L_Type, RT.Num_License, RT.Num_Active, Rt.Q_Date - CTE.Q_Date as Num_days
FROM CTE
INNER JOIN s.Table RT on CTE.Acct_ID = RT.Acct_ID
WHERE flag = 'N'
虽然我没有完全了解你想要实现的目标,但我不认为减去MIN QDate你会得到你想要的结果。
答案 1 :(得分:0)
我根本不认为您想要使用聚合函数(因此GROUP BY
)。相反,我认为你想要这样的东西:
SELECT acct_id, l_type, num_license, num_active
, q_date - MIN(q_date) OVER ( ) AS num_days
FROM s.table
WHERE flag = 'N';
即,使用MIN()
作为分析(窗口)函数。现在,如果您想获得每个活动天数的帐户数量,您可以执行以下操作:
SELECT TRUNC(num_days), COUNT(*) FROM (
SELECT acct_id, l_type, num_license, num_active
, q_date - MIN(q_date) OVER ( ) AS num_days
FROM s.table
WHERE flag = 'N'
) GROUP BY TRUNC(num_days);