2014-12-04 48 views
3

我已經回答並閱讀了很多關於獲得最大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

回答

2

您可以使用現有的查詢作爲子查詢,並獲得滿意的結果

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

1

這應該工作。

我認爲該表爲兩組數據,並根據日期和項目加入,而不是基於同一個學生。

這樣,如果在加入後存在任何記錄,我們知道他們具有相同的項目和日期,但不是同一個學生。對結果進行分組......並且你擁有你想要的東西。

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