MySQL получить последовательный подарок с максимальным или минимальным заказом - PullRequest
0 голосов
/ 12 марта 2020

Как получить последовательный подарок из данных посещаемости таблицы.

CREATE TABLE `a` (
  `id` int(6) NOT NULL,
  `uid` int(6) NOT NULL,
  `date` date NOT NULL,
  `time` time NOT NULL,
  `status` varchar(2) COLLATE utf8_unicode_ci NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

INSERT INTO `a` (`id`, `uid`, `date`, `time`, `status`) VALUES
(1, 1, '2020-03-12', '08:01:17', 'a'),
(2, 1, '2020-03-01', '08:01:17', 'p'),
(3, 1, '2020-03-02', '08:01:17', 'p'),
(4, 1, '2020-03-03', '08:01:17', 'p'),
(5, 1, '2020-03-04', '08:01:17', 'p'),
(6, 1, '2020-03-05', '08:01:17', 'l'),
(7, 1, '2020-03-06', '08:01:17', 'l'),
(8, 1, '2020-03-07', '08:01:17', 'p'),
(9, 1, '2020-03-08', '08:01:17', 'p'),
(10, 1, '2020-03-09', '08:01:17', 'l'),
(11, 1, '2020-03-10', '08:00:15', 'p'),
(12, 1, '2020-03-11', '08:02:27', 'p'),
(13, 2, '2020-03-01', '08:11:17', 'a'),
(14, 2, '2020-03-02', '08:01:17', 'p'),
(15, 2, '2020-03-03', '08:01:17', 'p'),
(16, 2, '2020-03-04', '08:01:17', 'p'),
(17, 2, '2020-03-05', '08:01:17', 'l'),
(18, 2, '2020-03-06', '08:01:17', 'p'),
(19, 2, '2020-03-07', '08:01:17', 'p'),
(20, 2, '2020-03-08', '08:01:17', 'p'),
(21, 2, '2020-03-09', '08:01:17', 'l'),
(22, 2, '2020-03-10', '08:00:15', 'p'),
(23, 2, '2020-03-11', '08:02:27', 'p'),
(24, 3, '2020-03-01', '08:11:17', 'l'),
(25, 3, '2020-03-02', '08:01:17', 'l'),
(26, 3, '2020-03-03', '08:01:17', 'p'),
(27, 3, '2020-03-04', '08:01:17', 'p'),
(28, 3, '2020-03-05', '08:01:17', 'l'),
(29, 3, '2020-03-06', '08:01:17', 'p'),
(30, 3, '2020-03-07', '08:01:17', 'p'),
(31, 3, '2020-03-08', '08:01:17', 'p'),
(32, 3, '2020-03-09', '08:01:17', 'l'),
(33, 3, '2020-03-10', '08:00:15', 'p'),
(34, 3, '2020-03-11', '08:02:27', 'p');

Пример вывода

uid    consecutive
1      4
2      3
3      3

1 день подряд 4 дня за 2020-03-01, 2020-03-02, 2020-03-03, 2020-03-04 2 дня подряд 3 для 2020-03-06, 2020-03-07, 2020-03-08

et c ...

Как мне создать sql для этого вывода?

1 Ответ

4 голосов
/ 12 марта 2020
WITH
cte1 AS (SELECT uid, `date` - INTERVAL ROW_NUMBER() OVER (PARTITION BY uid ORDER BY `date` ASC) DAY d
         FROM a
         WHERE status = 'p'),
cte2 AS (SELECT uid, COUNT(*) cnt
         FROM cte1
         GROUP BY uid, d)
SELECT uid, MAX(cnt) consecutive
FROM cte2
GROUP BY uid;

скрипка

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