我有一个日志表,其中有记录包含用户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月的所有月份都有活动。所以我想找到所有这些员工的清单。
答案 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())