Есть ли агрегатная функция в mySql, где можно показать диапазон, сравнивая два столбца со счетчиками - PullRequest
0 голосов
/ 05 мая 2020

предположим, что у меня есть данные в таблице mySql, как показано ниже:

+------+-------+------+
| Name | Start | End  |
+------+-------+------+
| A    | 1     | null |
| A    | 2     | null |
| A    | null  | 3    |
| B    | 4     | null |
| B    | 5     | null |
| B    | null  | 6    |
| A    | 7     | null |
| A    | 8     | null |
| A    | 9     | null |
| A    | null  | 10   |
+------+-------+------+

Теперь мне нужно показать следующий результат:

+------+-------+-----+-------+
| Name | Start | End | Count |
+------+-------+-----+-------+
| A    |     1 |   3 |     3 |
| B    |     4 |   6 |     3 |
| A    |     7 |  10 |     4 |
+------+-------+-----+-------+

Здесь первый A начинается с 1 и заканчивается на 3, поэтому

первая строка результата должна быть: A (имя) ---- 1 (начало) ---- 3 (конец) ---- 3 (количество)

вторая строка результата должна быть: B (имя) ---- 4 (начало) ---- 6 (конец) ---- 3 (количество)

А затем как A снова приходит с начальным значением 7 и конечным значением 10, поэтому

третья строка результата должна быть: A (имя) ---- 7 (начало) ---- 10 (конец) - - 4 (count)

Может ли кто-нибудь помочь мне с запросом, чтобы получить результат?

1 Ответ

1 голос
/ 05 мая 2020

Что-то в этом роде?

SELECT filtered.name, MIN(filtered.start), MAX(filtered.end), COUNT(*)
FROM (
SELECT t.name, t.start,t.end, @curRank := IF(t.name = @letterINIT, @curRank , @curRank + 1) AS rank, @letterINIT := t.name as letter
FROM test as t, (SELECT @curRank := 0) r, (SELECT @letterINIT := null) l
ORDER BY COALESCE(t.start, t.end)
) as filtered
GROUP BY filtered.name, filtered.rank
ORDER BY filtered.rank

http://sqlfiddle.com/#! 9 / 3cd215 / 1

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...