2017-07-19 52 views
0

我有42萬條記錄表,在以下範圍:MySQL的 - 條件GROUP BY

| id | date | sid | 
+----+------------+-----+ 
| 01 | 2016-07-09 | 487 | 
| 02 | 2016-07-09 | 487 | 
| 03 | 2016-07-09 | 487 | 
| 04 | 2016-07-09 | 487 | 
| 05 | 2016-07-09 | 487 | 
| 06 | 2016-07-09 | 753 | 
| 07 | 2017-07-01 | 987 | 
| 08 | 2017-07-01 | 432 | 
| 09 | 2017-07-01 | 432 | 
| 10 | 2017-01-13 | 753 | 
| 11 | 2017-01-13 | 863 | 
| 12 | 2015-01-22 | 255 | 
| 13 | 2015-05-22 | 255 | 
| 14 | 2015-05-22 | 100 | 
| 15 | 2016-07-09 | 487 | 
| 16 | 2016-07-09 | 487 | 
| 17 | 2016-07-09 | 487 | 
| 18 | 2016-07-09 | 487 | 
| 19 | 2017-07-01 | 987 | 
| 20 | 2017-07-01 | 487 | 
| 21 | 2017-01-13 | 753 | 
| 22 | 2017-01-13 | 863 | 
| 23 | 2015-05-22 | 255 | 
| 24 | 2015-05-22 | 100 | 
... 

我需要查詢該表,並獲得通過的記錄分組:

  • 日期sid是唯一的;
  • 日期後,SID,當表在這同一天

計數的目的有其他的SID與此相同的SID值。

換句話說,查詢需要返回:

| id | date | sid | 
+----+------------+-----+ 
| 01 | 2016-07-09 | 487 | 
| 06 | 2016-07-09 | 753 | 
| 07 | 2017-07-01 | 987 | 
| 08 | 2017-07-01 | 432 | 
| 10 | 2017-01-13 | 753 | 
| 11 | 2017-01-13 | 863 | 
| 12 | 2015-01-22 | 255 | 
| 13 | 2015-05-22 | 255 | 
| 14 | 2015-05-22 | 100 | 
| 15 | 2016-07-09 | 487 | 
| 19 | 2017-07-01 | 987 | 
| 20 | 2017-07-01 | 487 | 
| 21 | 2017-01-13 | 753 | 
| 22 | 2017-01-13 | 863 | 
| 23 | 2015-05-22 | 255 | 
| 24 | 2015-05-22 | 100 | 
... 

我的一個toughts的是一樣的東西:

SELECT * FROM `table` WHERE date(`date`) >= date('2015-01-01') and date(`date`) <= date('2017-07-20') group by CASE WHEN COUNT(`sid` = `sid`) > 0 THEN `sid` END 

#1111 - 無效使用組功能的

任何想法?

回答

1

看起來你只是想MIN(id)

SELECT MIN(id), DATE, sid 
FROM table 
GROUP BY DATE, sid 

其他注意事項:

  • WHERE條款可以簡化爲Date BETWEEN '2015-01-01' AND '2017-07-20'
  • 是您的柱真的叫Date?這不是一個很棒的專欄名稱。這是一個關鍵字,使得DATE()和其他日期函數的使用真的讓人困惑。
+0

** @ query **,我會試試你的建議。 **之間**,我不知道爲什麼,但是,使用之間的查詢的最終計數有差異。 ** @列名**,是的,它被稱爲日期,並且,是的,它可能不是一個好名字或實踐,我真的明白它,但我總是保留使用** **作爲列和表簡單地區分名稱和日期函數的名稱 – IonS

+0

@IonS只想提及列名 - 這取決於您。雖然你的方式也很好,但'BETWEEN'應該可以工作。你的日期是否有時間戳? –

+0

是的,我理解並且非常感謝你。 '\'date \''是日期時間列 – IonS