MySQL查询满足条件的连续时间段数据

文章转自《MySQL查询满足条件的连续时间段》及评论,主要涉及mysql变量的使用

建表:

CREATE TABLE `stadium` (
  `id` INT(11) NOT NULL AUTO_INCREMENT,
  `visit_date` DATE NOT NULL,
  `people` INT(32) NOT NULL,
  PRIMARY KEY (`id`)
)

数据:

方法一:

-- 查询连续至少3天游客数目大于700的数据;

SET @startdate = CAST(NULL AS DATE);
SET @granularity = 1;   /* DAY */
SET @minduration = 3;  /* DAY */
SET @minvalue = 699;
 
SELECT t.visit_date,t.people FROM (
  SELECT StartDate,MAX(visit_date) AS EndDate FROM (
    SELECT visit_date,people,
      CASE WHEN people > @minvalue OR @startdate IS NOT NULL 
      THEN IFNULL(@startdate, visit_date) 
      END AS StartDate,
      @startdate := 
      CASE WHEN people > @minvalue 
      THEN IFNULL(@startdate, visit_date) 
      END AS s
    FROM (
      SELECT visit_date, people FROM stadium
      UNION ALL
      SELECT MAX(visit_date) + INTERVAL @granularity DAY, @minvalue FROM stadium
    ) w
    ORDER BY visit_date
  ) w
  WHERE StartDate IS NOT NULL
  GROUP BY StartDate
) w
  INNER JOIN stadium t ON t.visit_date >= w.StartDate AND t.visit_date < w.EndDate
WHERE w.EndDate >= w.StartDate + INTERVAL @minduration DAY;

 查询结果: 

方法二:通过变量b每次加1来使得相邻的日期减去b是一个相同值,如果中间有不符合t条件的,日期减去b的值将会改变

SELECT a.*
FROM (
	SELECT stadium.*
		, DATE_FORMAT(visit_date, '%d') - (@b := @b + 1) AS c
	FROM `stadium`, (
			SELECT @b := 0
		) b
	WHERE people > 699
) a
	INNER JOIN (
		SELECT c
		FROM (
			SELECT stadium.*
				, DATE_FORMAT(visit_date, '%d') - (@e := @e + 1) AS c
			FROM `stadium`, (
					SELECT @e := 0
				) e
			WHERE people > 699
		) a
		GROUP BY c
		HAVING COUNT(c) > 2
	) b
	ON a.c = b.c

 查询结果:

相关文章:

SQL如何求解用户连续N天登录?

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值