获取每月有活动的人员的姓名-Oracle SQL
我有一个日志表,其中有用户id和特定活动完成日期的记录。我想得到每个月都有活动的用户的名字。我正在使用以下查询获取每月有活动的人员的姓名-Oracle SQL,sql,oracle,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
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月的所有月份都有活动。所以我想找到所有这些员工的名单 希望我能给你代码,但我有点赶时间,所以这更像是一个建议 您是否尝试过为每个用户提取不同的月份(从eventdate开始),如果有10行(假设是10月,您可以动态更改),那么员工必须每个月都有一个事件。非常低效,我认为您的意思是它不起作用。同一个值不能同时出现在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())
您可以使用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;
请你说清楚一点好吗?不工作=不是预期的结果?=语法错误?不工作=不是预期结果。对不起,这是一个误导性的陈述。答案经过编辑,但这仍然是一个猜测游戏,因为我不确定你到底想要什么。你能不能现在再详细一点?谢谢@Ramblin。。。它工作得很好。但问题是我有一个数据库有大约2亿行。因此,您的查询大约需要6个小时才能得到结果。我有没有办法加快这个过程?