按计算字段分组

时间:2016-03-16 21:04:27

标签: sql oracle group-by

我有一个带有日期的数据集,并且每个日期附加了一些值。我正在跨帐户汇总信息,并按帐户和活跃天数进行分组。我想知道帐户的平均行为。我不关心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)

这会产生错误"此处不允许使用群组功能"

如何按天数进行分组?谢谢!

2 个答案:

答案 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);
相关问题