MySQL - 条件组BY

时间:2017-07-19 20:00:59

标签: mysql sql group-by aggregate-functions

我有一个4200万条记录表,在以下范围内:

| 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 |
...

我的一个难点就是:

 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 个答案:

答案 0 :(得分:1)

看起来你只想要function showCode() { // Generate Python code and display it. var code = Blockly.Python.workspaceToCode(workspace); alert(code); }

MIN(id)

附加说明:

  • 您的SELECT MIN(id), DATE, sid FROM table GROUP BY DATE, sid 条款可以简化为WHERE
  • 您的专栏是否真的被称为Date BETWEEN '2015-01-01' AND '2017-07-20'?这不是一个很棒的专栏名称。它是一个关键字,使Date和其他日期函数的使用真的令人困惑。