繁体   English   中英

MySQL-连续出现的次数

[英]MySQL - Count of consecutive occurrences

关于这个小提琴

create table tbl(`date` date, customer varchar(200), 
                  serv_info varchar(200), category varchar(20));

insert into tbl values
('2015-01-01', 'customerA', 'Type1Id1', 'AG'),
('2015-01-02', 'customerA', 'Type1Id1', 'AG'),
('2015-01-03', 'customerA', 'Type1Id1', 'AG'),
('2015-01-11', 'customerA', 'Type1Id2', 'AG'),
('2015-01-13', 'customerA', 'Type1Id2', 'AG'),
('2015-01-16', 'customerA', 'Type1Id3', 'AG'),
('2015-01-20', 'customerA', 'Type2Id1', 'AG'),
('2015-01-21', 'customerA', 'Type2Id1', 'AG'),
('2015-01-22', 'customerA', 'Type2Id1', 'AG'),
('2015-01-23', 'customerA', 'Type2Id1', 'AG'),
('2015-01-11', 'customerA', 'Type1Id1', 'AG'),
('2015-01-12', 'customerA', 'Type1Id1', 'AG'),
('2015-01-13', 'customerA', 'Type1Id1', 'AG');

我想看下面的输出-

10/01/15 - Type1Id1 -10
11/01/15 - Type1Id2 - 5
16/01/15 - Type1Id1 -3

我已经设法用SQL进行了分类,但是,我不能完全满足要求,特别是在不同时间点给定类型的同一服务器ID的连续计数。 (我不是一个成熟的MYSQL人,因此很难做到这一点)

我能否要求帮助以使它完全正常工作。 我已经尽力解释了这种情况。 如果不清楚,请让我知道不清楚的地方,我将尝试重述。

这是一个基于聚合函数,分组依据和用户变量的解决方案。 用户变量在此处用于保证结果。

输出也会略微格式化以符合要求。

SQL:

-- Data preparation
create table tbl(`date` date, customer varchar(200), serv_info varchar(200), category varchar(20));
insert into tbl values
('2015-01-01', 'customerA', 'Type1Id1', 'AG'),
('2015-01-02', 'customerA', 'Type1Id1', 'AG'),
('2015-01-03', 'customerA', 'Type1Id1', 'AG'),
('2015-01-11', 'customerA', 'Type1Id2', 'AG'),
('2015-01-13', 'customerA', 'Type1Id2', 'AG'),
('2015-01-16', 'customerA', 'Type1Id3', 'AG'),
('2015-01-20', 'customerA', 'Type2Id1', 'AG'),
('2015-01-21', 'customerA', 'Type2Id1', 'AG'),
('2015-01-22', 'customerA', 'Type2Id1', 'AG'),
('2015-01-23', 'customerA', 'Type2Id1', 'AG'),
('2015-01-11', 'customerA', 'Type1Id1', 'AG'), 
('2015-01-12', 'customerA', 'Type1Id1', 'AG'), 
('2015-01-13', 'customerA', 'Type1Id1', 'AG');
SELECT * FROM tbl;

-- Needed
SET @rownum = 0;
SET @typeid = '';
SELECT 
    CONCAT( DATE_FORMAT(assign_date, '%d/%m/%y'), ' - ', tbl2.serv_info, ' - ', tbl2.consecutive_days ) Output
FROM 
    (SELECT 
        MIN(`date`) assign_date, 
        serv_info, 
        COUNT(1) consecutive_days,
        @rownum:=@rownum+(serv_info != @typeid) conse_group,
        @typeid:=serv_info
    FROM tbl
    WHERE customer = 'customerA'
    GROUP BY conse_group) tbl2;

输出:

mysql> SELECT * FROM tbl;
+------------+-----------+-----------+----------+
| date       | customer  | serv_info | category |
+------------+-----------+-----------+----------+
| 2015-01-01 | customerA | Type1Id1  | AG       |
| 2015-01-02 | customerA | Type1Id1  | AG       |
| 2015-01-03 | customerA | Type1Id1  | AG       |
| 2015-01-11 | customerA | Type1Id2  | AG       |
| 2015-01-13 | customerA | Type1Id2  | AG       |
| 2015-01-16 | customerA | Type1Id3  | AG       |
| 2015-01-20 | customerA | Type2Id1  | AG       |
| 2015-01-21 | customerA | Type2Id1  | AG       |
| 2015-01-22 | customerA | Type2Id1  | AG       |
| 2015-01-23 | customerA | Type2Id1  | AG       |
| 2015-01-11 | customerA | Type1Id1  | AG       |
| 2015-01-12 | customerA | Type1Id1  | AG       |
| 2015-01-13 | customerA | Type1Id1  | AG       |
+------------+-----------+-----------+----------+
13 rows in set (0.00 sec)

mysql>
mysql> -- Needed
mysql> SET @rownum = 0;
Query OK, 0 rows affected (0.00 sec)

mysql> SET @typeid = '';
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT
    -> CONCAT( DATE_FORMAT(assign_date, '%d/%m/%y'), ' - ', tbl2.serv_info, ' - ', tbl2.consecutive_days ) Output
    -> FROM
    ->     (SELECT
    ->     MIN(`date`) assign_date,
    ->     serv_info,
    ->     COUNT(1) consecutive_days,
    ->     @rownum:=@rownum+(serv_info != @typeid) conse_group,
    ->     @typeid:=serv_info
bl2;
    ->     FROM tbl
    ->     WHERE customer = 'customerA'
    ->     GROUP BY conse_group) tbl2;
+-------------------------+
| Output                  |
+-------------------------+
| 01/01/15 - Type1Id1 - 3 |
| 11/01/15 - Type1Id2 - 2 |
| 16/01/15 - Type1Id3 - 1 |
| 20/01/15 - Type2Id1 - 4 |
| 11/01/15 - Type1Id1 - 3 |
+-------------------------+
5 rows in set (0.00 sec)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM