MySQL Группировка с условным - PullRequest
0 голосов
/ 09 мая 2018

У меня есть такие данные:

+---------------+------+
| timestamp     | robo |
+---------------+------+
| 1518259341785 | A    |
| 1518259341785 | A    |
| 1518259341785 | A    |
| 1518259341785 | RE   |
+---------------+------+

и это:

+---------------+------+
| timestamp     | robo |
+---------------+------+
| 1518259341788 | RE   |
| 1518259341788 | RE   |
| 1518259341788 | RE   |
| 1518259341788 | A    |
+---------------+------+

как мы все знаем, если мы сгруппируем данные и посчитаем строки, используя этот SQL:

SELECT timestamp, robo, COUNT(*) AS num_rows
FROM tables
GROUP BY timestamp

num_rows будет 4. как я могу сгруппировать данные с условием only if robo RE = 1 в метке времени. так что 1518259341788 группа не будет считаться / появляться. спасибо.

обновление: Результат группировки без условия:

+---------------+------+----------+
| timestamp     | robo | COUNT(*) |
+---------------+------+----------+
| 1518259341785 | A    |        4 |
| 1518259341788 | A    |        4 |
+---------------+------+----------+

ожидаемый результат группировки с условным:

+---------------+------+----------+
| timestamp     | robo | COUNT(*) |
+---------------+------+----------+
| 1518259341785 | A    |        4 |
+---------------+------+----------+

Ответы [ 3 ]

0 голосов
/ 09 мая 2018

Если вы хотите получить количество записей для каждого значения timestamp, но только если количество RE записей для этого значения timestamp равно 1, вы можете сделать это следующим образом:

SELECT timestamp, COUNT(*) AS num_rows
  FROM tables
 GROUP BY timestamp
HAVING SUM(CASE WHEN robo = 'RE' THEN 1 ELSE 0 END) = 1
0 голосов
/ 09 мая 2018

Этот запрос должен работать:

SELECT timestamp, robo, COUNT(*) AS num_rows
FROM mytables
WHERE timestamp 
NOT IN (SELECT b.timestamp FROM mytables b
        JOIN (SELECT timestamp, count(*) FROM mytables
              WHERE robo = 'RE' 
              GROUP BY timestamp 
              HAVING COUNT(*) > 1) 
        a on a.timestamp = b.timestamp )
GROUP BY timestamp, robo

Результаты будут:

timestamp                  robo num_rows     
1518259341785               RE  1
1518259341785               A   3

Я не уверен, насколько возможны ожидаемые вами результаты.

0 голосов
/ 09 мая 2018

Вы можете использовать внутреннее объединение для подвыбора для отметки времени, просто считая = 1 для robo = RE

  SELECT timestamp, robo, COUNT(*) AS num_rows
  FROM tables
  INNER join (
    select timestamp
    from tables
    where robo ='RE'
    group by timestamp 
    having count(*) = 1
    ) t on tables.timestamp = t.timestamp
  GROUP BY timestamp
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...