如何避免群体,但需要最低数量?

问题描述:

我已经回答并阅读了很多关于获得最大n组的问题,但现在发现自己需要相反。如何避免群体,但需要最低数量?

我有一个结果集,显示学生,日期和项目,代表哪些学生在某一天的项目中工作。

我想查看有多名学生在当天为一个项目工作的行。所以,如果我的结果集是这样的:

| student | date | project | 
+---------+------------+---------+ 
| 1 | 2014-12-04 | 1 | 
| 2 | 2014-12-04 | 1 | 
| 3 | 2014-12-04 | 1 | 
| 1 | 2014-12-03 | 1 | 

我只想看到前三排,这样我就可以看到学生1,2,3在同一天一起工作在同一个项目。我可以这样过滤:

GROUP BY date, project 
HAVING COUNT(*) > 1 

但是只有一行会被返回。

+0

因此,只要超过1名学生参与了项目,您想要查看所有参与项目的学生,日期和项目吗? – xQbert 2014-12-04 18:48:09

+0

@xQbert是的,但也是在同一天。如果学生1在12/03学习,而学生2在12/02学习,我不想看到,因为在那个特定的日子里只有一个学生。 – AdamMc331 2014-12-04 18:49:02

您可以使用现有的查询作为子查询,并获得满意的结果

SQL FIDDLE DEMO

SELECT * from Table1 T1 
JOIN 
(
    SELECT date, project 
    from table1 
    group by date, project 
    having count(*) >1 
) t 
on t1.date = t.date 
and t1.project = t.project 
+0

你能看到为什么这会效率低下的任何特定原因吗?我的意思是,我正在处理一个比较小的数据库(我们有不到1000个项目,少于200名学生,而且我不希望日期增长太多,因为我会过滤最近的项目)。我只是犹豫了一下“自我加入”的想法。 – AdamMc331 2014-12-04 18:52:50

+0

@ McAdam331,我们需要一个自加入,只要索引存在日期,项目列,它应该是好的。 – radar 2014-12-04 18:54:47

+0

是的,我相信我们的DBA来设计这个井。所有东西都被编入索引我用速记来表达我的观点,但我已经加入了大约4个DB表格来获取人员,日期和项目。 – AdamMc331 2014-12-04 18:55:37

这应该工作。

我认为该表为两组数据,并根据日期和项目加入,而不是基于同一个学生。

这样,如果在加入后存在任何记录,我们知道他们具有相同的项目和日期,但不是同一个学生。对结果进行分组......并且你拥有你想要的东西。

SELECT A.student, A.date, A.project 
from table a 
INNER JOIN table b 
on A.date=B.Date 
and A.Project=B.Project 
and a.student<> b.student 
group by A.student, a.date, a.project 
+0

这不是一个坏主意,但对我来说实施起来会有点困难。 'student'和'project'是我真实世界数据库的别名,它有4个连接从学生到项目。 – AdamMc331 2014-12-04 18:55:04