星期日从星期开始分组

时间:2013-06-04 20:48:49

标签: sql oracle

我有一个包含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日

2013-04-21

2 个答案:

答案 0 :(得分:0)

http://www.techonthenet.com/oracle/functions/to_char.phpTo_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

虽然这不是最佳方式,但如果你发布了问题所涉及的模式会更容易