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上运行良好。真的很奇怪。我以前的回答中有一些拼写错误。可能就是这样。