0

我有一个带有 eventdatetime 、 userid 等的表。数据每天都插入到表中。

对于报告,我需要计算 userid , projectid 按周分组:Tue-Mon 一次一个月范围。

我需要按月按周对数据进行分组的帮助。我正在使用甲骨文。

select count(distinct( table1.projectid))as Projects, count(distinct( table2.userid)) as Users,?? 
from table1
join table 2
on table1.a= table2.a
where table1.e='1'
and  table1.eventdatetime between sysdate-30 and sysdate-1  

通过...分组 ??

我希望输出按周分组,例如: WeekBegin 2013-04-14

2013-04-21

4

2 回答 2

0

如果您发布的示例是您正在进行的工作版本 - 在担心获取星期几之前,您应该考虑正确获取查询的基础知识

您正在选择 e.projectid 和 u.userid 但您的查询中没有任何名为 e 或 u 的表 - 看起来您想将它们别名为 e 和 u?

您的查询的 where 子句也在寻找不存在的表 e

在这种情况下,你应该改变

from table1 
join table2
on table1.a= table2.a

from table1 e        -- select from table1 using alias e
  join table2 u      -- join table2 using alias u
    on ( e.a = u.a ) -- joining on column a from table1 (e) = a from table2 (u)

一旦您将 on 部分中的 a 替换为要加入的列名,在您删除最后一列“,??”后,它可能会很好地运行。从选择 - 也许是这样的

select
  count (e.projectid) PROJECTS,
  count (u.userid) USERS

from table1 e
  join table2 u
    on ( e.a = u.a )

where e.FILTERING_COLUMN = '1'
  and e.eventdatetime >= sysdate-30

请注意,由于 sysdate 是服务器上的当前时间(取决于本地化和会话设置),您可以使用大于 sysdate-30 而不是介于两者之间的时间

分组的基本规则是,要选择一个列,您需要按它进行分组或使用聚合函数,例如 COUNT()

所以你可能会想要类似的东西

select
  count (e.projectid) PROJECTS,
  count (u.userid) USERS,
  to_char(e.eventdatetime,'MM') MONTH

from table1 e
  join table2 u
    on ( e.a = u.a )

where e.FILTERING_COLUMN = '1'
  and e.eventdatetime >= sysdate-30

group by e.eventdatetime

虽然这不是最优化的方法,但如果您发布问题中涉及的模式会更容易

于 2013-06-04T21:08:16.960 回答
0

http://www.techonthenet.com/oracle/functions/to_char.php 使用To_Char函数IW来获取星期。然后你可以GROUP BY那个IW值。

请注意,Oracle 周的开始日期取决于数据库的语言设置。一些国家在周日和一些周一开始。您必须查看您的设置才能看到。如果它已经在周日开始,那么你很幸运!

于 2013-06-04T20:56:26.117 回答