Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 计算最大序列长度_Mysql - Fatal编程技术网

Mysql 计算最大序列长度

Mysql 计算最大序列长度,mysql,Mysql,我有一个包含以下数据的表格 (1995, 'a'), (1996, 'a'), (1997, 'a'), (1998, 'a'), (2000, 'a'), (1995, 'b'), (1997, 'b'), (1998, 'b'), (1995, 'c'), (1999, 'c'), (2000, 'c'), (1999, 'd'), (1999, 'e'), (1999, 'f'); 我需要计算每个字母表的最大序列长度,例如,由于1995199619971998中连续出现“a”,

我有一个包含以下数据的表格

(1995, 'a'),
(1996, 'a'),
(1997, 'a'),
(1998, 'a'),
(2000, 'a'),

(1995, 'b'),
(1997, 'b'),
(1998, 'b'),

(1995, 'c'),
(1999, 'c'),
(2000, 'c'),

(1999, 'd'),

(1999, 'e'),

(1999, 'f');
我需要计算每个字母表的最大序列长度,例如,由于1995199619971998中连续出现“a”,因此“a”的最大序列长度为4。预期产出为:

a-4
b-2
c-2
d-1
e-1
f-1

考虑以下几点:

DROP TABLE IF EXISTS my_table;

CREATE TABLE my_table (year INT NOT NULL,string CHAR(1) NOT NULL,PRIMARY KEY(year,string));

INSERT INTO my_table VALUES
    (1995, 'a'),
    (1996, 'a'),
    (1997, 'a'),
    (1998, 'a'),
    (2000, 'a'),

    (1995, 'b'),
    (1997, 'b'),
    (1998, 'b'),

    (1995, 'c'),
    (1999, 'c'),
    (2000, 'c'),

    (1999, 'd'),

    (1999, 'e'),

    (1999, 'f');

SELECT string
     , MAX(diff) FROM
     ( SELECT a.string
            , a.year start
            , MIN(c.year) end 
            , MIN(c.year) - a.year+1 diff
         FROM my_table a
         LEFT 
         JOIN my_table b
           ON b.string = a.string
          AND b.year + 1 = a.year
         LEFT 
         JOIN my_table c
           ON c.string = a.string
          AND c.year >= a.year
         LEFT 
         JOIN my_table d
           ON d.string = a.string
          AND d.year - 1 = c.year
        WHERE b.string IS NULL 
          AND c.string IS NOT NULL
          AND d.string IS NULL
        GROUP 
           BY a.string,a.year
     ) a 
 GROUP 
    BY string; 

+--------+-----------+
| string | MAX(diff) |
+--------+-----------+
| a      |         4 |
| b      |         2 |
| c      |         2 |
| d      |         1 |
| e      |         1 |
| f      |         1 |
+--------+-----------+
编辑:我对变量有一种审美厌恶,但事实上,就性能而言,它们更有效

SELECT string
     , MAX(i) 
  FROM
     (
       SELECT year
            , string
            , IF(year=@prev_year+1,IF(string=@prev_string,@i:=@i+1,@i:=1),@i:=1)i
            , @prev_year := year
            , @prev_string := string 
         FROM my_table
            , ( SELECT @prev_year=0,@prev_string:='',@i:=1 ) vars 
        ORDER 
           BY string
            , year
     ) x
 GROUP 
    BY string;
+--------+--------+
| string | MAX(i) |
+--------+--------+
| a      |      4 |
| b      |      2 |
| c      |      2 |
| d      |      1 |
| e      |      1 |
| f      |      1 |
+--------+--------+

我认为下面的代码会对您有所帮助

SELECT string, COUNT(string) AS MAX
FROM my_table
GROUP BY string
HAVING COUNT(string)>=1;

您需要定义“连续”(至少,应该查找哪个字段的顺序),因为在SQL中,本质上没有“连续”这样的东西-记录不是自己排序的,它们可能只在某些select查询结果集中排序-因此,这必须由一些人来做field@AlmaDo在这种情况下是非常不正确的。所有需要定义的内容都已定义。@AlmaDo“Continuous”基于“year”字段,如上面的示例所示。定义了什么?我看不到字段定义,也看不到期望值-如果是
1991-a、1992-a、1993-b、1994-a,会发生什么情况
@AlmaDo在您的情况下,“a”的最大序列长度将是2,“b”将是1。我在服务器上尝试了大约30K条记录,mysql刚刚冻结,是否可以更改查询,使其能够处理大型数据集。使用变量的解决方案可能会执行得更好。请参阅编辑。谢谢,但是更新后的查询在我的服务器上为5.5.40-MariaDB-MariaDB提供了不正确的结果,尽管在sqlfiddle上运行良好。真的很奇怪。我以前的回答中有一些拼写错误。可能就是这样。