获得每个月都有活动的人的名字 - Oracle SQL

时间:2013-10-25 16:40:26

标签: sql oracle

我有一个日志表,其中有记录包含用户ID和完成特定活动的日期。我希望每个月都能获得有活动用户的姓名。我使用以下查询

select distinct(employeeid) from transactions 
where eventdate between '01-OCT-13' AND '23-OCT-13'
and eventdate between '01-SEP-13' AND '01-OCT-13'
and eventdate between '01-AUG-13' AND '01-SEP-13'
and eventdate between '01-JUL-13' AND '01-AUG-13';

但这不起作用。有人可以建议任何改进吗?

修改 由于我的问题似乎有点令人困惑,这里有一个例子

EmployeeID | Timestamp
a          | 01-Jul-13  
b          | 01-Jul-13  
a          | 01-Aug-13  
c          | 01-Aug-13  
a          | 01-Sep-13  
d          | 01-Sep-13  
a          | 01-Oct-13  
a          | 01-Oct-13

在上表中,我们可以看到员工“a”在7月到10月的所有月份都有活动。所以我想找到所有这些员工的清单。

3 个答案:

答案 0 :(得分:1)

您可以使用COUNT作为分析功能,并获取每位员工的月数和总月数。然后只选择两个计数匹配的员工。

select distinct employeeid
from (
    select employeeid,
           count(distinct trunc(eventdate,'month'))    --count of months for each employee
                 over (partition by employeeid) as emp_months,
           count(distinct trunc(eventdate,'month'))    --count of all months
                 over () as all_months,
    from transactions
    )
where emp_months = all_months;

答案 1 :(得分:0)

希望我能给你代码,但我有点匆忙,所以这更像是一个建议。

您是否尝试为每个用户提取不同的月份(来自eventdate),如果有10行(假设它是10月,您可以动态更改此行),那么员工必须每个月都有一个事件。< / p>

答案 2 :(得分:0)

非常低效,我认为你的意思是它不起作用。同一个值不能同时出现在9月,10月等等。

无论如何,使用@LaggKing建议,您可以尝试此查询:

SELECT employeeid
FROM (
 SELECT DISTINCT employeeid, MONTH(eventdate)
 FROM transactions
)
HAVING COUNT(*) = MONTH(NOW())

编辑:您需要考虑年份。

SELECT employeeid
FROM (
 SELECT DISTINCT employeeid, MONTH(eventdate)
 FROM transactions
 WHERE YEAR(eventdate) = YEAR(NOW())
)
HAVING COUNT(*) = MONTH(NOW())