我想按列值的连续出现将查询结果分组.假设我有一张表格,其中列出了每年比赛的获胜者,如下所示:
year team_name
2000 AAA
2001 CCC
2002 CCC
2003 BBB
2004 AAA
2005 AAA
2006 AAA
我想要一个查询,输出:
start_end total team_name
2000 1 AAA
2001-2002 2 CCC
2003 1 BBB
2004-2006 3 AAA
只要我有开始和结束或范围(例如,可以使用GROUP_CONCAT生成2004,2005,2006而不是2004-2006,我就不用太担心“ start_end”的格式,那仍然可以) ).
解决方法:
只要您的表格如下所示:
"id";"year";"team"
"1";"2000";"AAA"
"2";"2001";"CCC"
"3";"2002";"CCC"
"4";"2003";"BBB"
"5";"2004";"AAA"
"6";"2005";"AAA"
"7";"2006";"AAA"
这个查询应该可以解决这个问题:
SELECT a.year AS start
, MIN(c.year) AS end
, MIN(c.year)-a.year+1 AS total
, CONCAT_WS('-', a.year, IF(a.year = min(c.year), NULL, min(c.year))) as start_end
, a.team
FROM
( SELECT x.year, x.team, COUNT(*) id
FROM results x
JOIN results y
ON y.year <= x.year
GROUP BY x.id
) AS a
LEFT JOIN
( SELECT x.year, x.team, COUNT(*) id
FROM results x
JOIN results y
ON y.year <= x.year
GROUP BY x.id
) AS b ON a.id = b.id + 1 AND b.team = a.team
LEFT JOIN
( SELECT x.year, x.team, COUNT(*) id
FROM results x
JOIN results y
ON y.year <= x.year
GROUP BY x.id
) AS c ON a.id <= c.id AND c.team = a.team
LEFT JOIN
( SELECT x.year, x.team, COUNT(*) id
FROM results x
JOIN results y
ON y.year <= x.year
GROUP BY x.id
) AS d ON c.id = d.id - 1 AND d.team = c.team
WHERE b.id IS NULL AND c.id IS NOT NULL AND d.id IS NULL
GROUP BY start;
顺便说一句,您可能会发现Common Queries Tree可以轻松解决这些问题(请查看“查找序列中的上一个和下一个值”的答案):p.
标签:mysql,group-by 来源: https://codeday.me/bug/20191209/2097250.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。