mysql中连续出现,MySQL组连续出现

I would like to group query results by consecutive appearances of a column values. Let's say I have a table which lists the winners of a competition for each year as follows:

year team_name

2000 AAA

2001 CCC

2002 CCC

2003 BBB

2004 AAA

2005 AAA

2006 AAA

I would like a query which outputs:

start_end total team_name

2000 1 AAA

2001-2002 2 CCC

2003 1 BBB

2004-2006 3 AAA

I'm not too much worried about the format of "start_end" at long as I have the start and end or range (.e.g. one could use GROUP_CONCAT to produce 2004,2005,2006 instead of 2004-2006 and that would still be OK).

解决方案

Provided that your table looks like this :

"id";"year";"team"

"1";"2000";"AAA"

"2";"2001";"CCC"

"3";"2002";"CCC"

"4";"2003";"BBB"

"5";"2004";"AAA"

"6";"2005";"AAA"

"7";"2006";"AAA"

This query should do the trick :

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;

BTW You might find the Common Queries Tree handy to solve these problems (check the answers for "Find previous and next values in a sequence") :p.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值