2017-07-19 87 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