如何计算一列中分隔值之间的重复值的数量,并将该值存储在另一个表中

时间:2017-08-07 12:28:58

标签: mysql

我有一个包含两列(id3和COL 1)的表(cor)。 id3是自动增量。 COL 1包含3种类型的值A / 0/1。

这些值遵循严格的规则。 A之后可以跟随0或1。 一个0之后只能跟一个A. 1之后只能跟随1或0。

看起来像这样:

id3    | COL 1
------ | ------ 
  1    |  A
  2    |  1     
  3    |  1     
  4    |  0
  5    |  A
  6    |  0
  7    |  A   
  8    |  1
  9    |  0
 10    |  A

我想要的是两个A之间连续1的数量,用于存储在第二个表(garb)中的整个列。 最终结果应如下所示:

  Val
  ------
   2
   0
   1

到目前为止,我的方法是仅将相互重复的值复制到新表中。 为此我使用了这段代码:

INSERT INTO garb (ida2)  SELECT id3  FROM cor;

INSERT INTO garb (ida) SELECT Id3 from cor a1 where 0 < (select count(*) from cor a2 where a2.Id3 = a1.Id3 + 1 and a2.`COL 1` = a1.`COL 1`);

现在我有重复1的ID。我也知道2号码中断是下一个重复开始的时间。

但是如何统计并保存每个A之间的重复次数? 或者如果有更简单的解决方案也可以。

提前致谢, 布赖恩

1 个答案:

答案 0 :(得分:0)

选项可以是(小心性能问题):

mysql> DROP TABLE IF EXISTS `garb`, `cor`;
Query OK, 0 rows affected (0.00 sec)

mysql> CREATE TABLE IF NOT EXISTS `garb` (
    ->   `ida` BIGINT UNSIGNED NOT NULL
    -> );
Query OK, 0 rows affected (0.01 sec)

mysql> CREATE TABLE IF NOT EXISTS `cor` (
    ->   `id3` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
    ->   `COL 1` CHAR(1),
    ->   KEY (`COL 1`)
    -> );
Query OK, 0 rows affected (0.00 sec)

mysql> INSERT INTO `cor`
    ->   (`COL 1`)
    -> VALUES
    ->   ('A'), ('1'), ('1'), ('0'),
    ->   ('A'), ('0'), ('A'), ('1'),
    ->   ('0'), ('A');
Query OK, 10 rows affected (0.00 sec)
Records: 10  Duplicates: 0  Warnings: 0

mysql> INSERT INTO `garb`
    -> SELECT SUM(IF(`cor`.`COL 1` = '1', 1, 0)) `Val`
    -> FROM (
    ->   SELECT
    ->      `cor_out`.`id3` `min`,
    ->      (SELECT `cor_in`.`id3`
    ->       FROM `cor` `cor_in`
    ->       WHERE `cor_in`.`id3` > `cor_out`.`id3` AND
    ->             `cor_in`.`COL 1` = 'A'
    ->       LIMIT 1) `max`
    ->   FROM `cor` `cor_out`
    ->   WHERE `cor_out`.`COL 1` = 'A'
    -> ) `der`
    ->   INNER JOIN `cor` ON `cor`.`id3`
    ->     BETWEEN `der`.`min` AND
    ->             `der`.`max` AND
    ->     `cor`.`COL 1` != 'A'
    -> WHERE `der`.`max` IS NOT NULL
    -> GROUP BY `der`.`min`, `der`.`max`;
Query OK, 3 rows affected (0.00 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> SELECT `ida`
    -> FROM `garb`;
+-----+
| ida |
+-----+
|   2 |
|   0 |
|   1 |
+-----+
3 rows in set (0.00 sec)

请参阅db-fiddle