繁体   English   中英

从周日开始按周分组

[英]Group by Week beginning Sunday

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

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

我需要每周按月对数据进行分组的帮助。 我正在使用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-04-14

2013-04-21

http://www.techonthenet.com/oracle/functions/to_char.phpIW使用To_Char函数来获取星期。 然后,您可以GROUP BYIW值。

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

如果您发布的示例是正在进行的版本-在担心获取星期几之前,应先了解正确的查询基础

您正在选择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的值,而不是使用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

尽管这不是实现此目的的最佳方法,但是如果发布了涉及该问题的模式,则会更容易

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM