0

我有日志表,其中记录了用户 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 月的所有月份都有活动。所以我想找到所有这些员工的名单。

4

3 回答 3

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;
于 2013-10-26T03:02:42.563 回答
0

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

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

于 2013-10-25T17:32:26.787 回答
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())
于 2013-10-25T17:48:24.697 回答