如何避免群体,但需要最低数量?
我已经回答并阅读了很多关于获得最大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
但是只有一行会被返回。
您可以使用现有的查询作为子查询,并获得满意的结果
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
你能看到为什么这会效率低下的任何特定原因吗?我的意思是,我正在处理一个比较小的数据库(我们有不到1000个项目,少于200名学生,而且我不希望日期增长太多,因为我会过滤最近的项目)。我只是犹豫了一下“自我加入”的想法。 – AdamMc331 2014-12-04 18:52:50
@ McAdam331,我们需要一个自加入,只要索引存在日期,项目列,它应该是好的。 – radar 2014-12-04 18:54:47
是的,我相信我们的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
这不是一个坏主意,但对我来说实施起来会有点困难。 'student'和'project'是我真实世界数据库的别名,它有4个连接从学生到项目。 – AdamMc331 2014-12-04 18:55:04
因此,只要超过1名学生参与了项目,您想要查看所有参与项目的学生,日期和项目吗? – xQbert 2014-12-04 18:48:09
@xQbert是的,但也是在同一天。如果学生1在12/03学习,而学生2在12/02学习,我不想看到,因为在那个特定的日子里只有一个学生。 – AdamMc331 2014-12-04 18:49:02