我有一个包含eventdatetime,userid等的表。数据每天都会插入到表中。
对于报告,我需要给出按周分组的用户ID,projectid:一次为一个月的Tue-Mon。
我需要帮助按月分组数据。我正在使用Oracle。
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年4月14日
答案 0 :(得分:0)
http://www.techonthenet.com/oracle/functions/to_char.php将To_Char
功能与IW
一起使用即可获得一周。然后,您可以GROUP BY
IW
值。
请注意,Oracle周开始的日期取决于数据库的语言设置。有些国家在周日和某个星期一开始。您必须查看您的设置才能看到。如果它已经在周日开始,那么你很幸运!
答案 1 :(得分: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
虽然这不是最佳方式,但如果你发布了问题所涉及的模式会更容易