Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
获取每月有活动的人员的姓名-Oracle SQL_Sql_Oracle - Fatal编程技术网

获取每月有活动的人员的姓名-Oracle SQL

获取每月有活动的人员的姓名-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

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

希望我能给你代码,但我有点赶时间,所以这更像是一个建议

您是否尝试过为每个用户提取不同的月份(从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个小时才能得到结果。我有没有办法加快这个过程?