这是一张签到记录表,我要SQL查出今天往前连续签到天数,比如前天没签,昨天和今天签了,连续天数就是2,昨天没签今天签了,连续天数就是1

木头亻 2018-12-06 10:59:08

最近做个需求,每天用户签完到后立马SQL查询用户已经连续签到几天了,所以要查出这个天数。这是MySQL数据库
...全文
615 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
zjcxc 2018-12-07
  • 打赏
  • 举报
回复
这个适合用触发器,在 INSERT 签到记录的时候,直接累计一下签到天数
吉普赛的歌 2018-12-07
  • 打赏
  • 举报
回复
邹老大的思路也不错。 不过, 建议不要触发器, 直接用程序实现: 1. 增加一个字段: times 2. 更新每条记录的 times 3. 程序插入记录时, 先与此人前一天记录对比, 得到这个字段的值后再一起插入。
吉普赛的歌 2018-12-06
  • 打赏
  • 举报
回复
USE tempdb
GO
IF OBJECT_ID('t') IS NOT NULL DROP TABLE t
GO
CREATE TABLE t(
	id INT IDENTITY(1,1) PRIMARY KEY,
	[name] NVARCHAR(10) NOT NULL DEFAULT('张三'),
	visit_time DATETIME	
)
GO
INSERT INTO t(name,visit_time) VALUES ('张三','2018-12-01 08:00:00')
INSERT INTO t(name,visit_time) VALUES ('张三','2018-12-02 08:00:00')
INSERT INTO t(name,visit_time) VALUES ('张三','2018-12-04 08:00:00')
INSERT INTO t(name,visit_time) VALUES ('张三','2018-12-05 08:00:00')
INSERT INTO t(name,visit_time) VALUES ('张三','2018-12-06 08:00:00')
--
INSERT INTO t(name,visit_time) VALUES ('李四','2018-12-01 08:00:00')
INSERT INTO t(name,visit_time) VALUES ('李四','2018-12-03 08:00:00')
INSERT INTO t(name,visit_time) VALUES ('李四','2018-12-04 08:00:00')
INSERT INTO t(name,visit_time) VALUES ('李四','2018-12-05 08:00:00')
INSERT INTO t(name,visit_time) VALUES ('李四','2018-12-06 08:00:00')

;WITH cte1 AS(
          SELECT *,
                 DATEDIFF(DAY, (SELECT MIN(visit_time) FROM t), visit_time) AS rid
          FROM   t
      ),cte2 AS(
          SELECT NAME,
                 rid,
                 rid -ROW_NUMBER()OVER(PARTITION BY [name] ORDER BY rid) AS diff
          FROM   cte1
      )
      ,cte3 AS (
          SELECT NAME,
                 MIN(rid)  AS start_range,
                 MAX(rid)  AS end_range
          FROM   cte2
          GROUP BY
                 diff,
                 NAME
      )
 
 SELECT 
		cte1.id
		,cte1.[name]
		,cte1.[visit_time]
		,cte1.rid -start_range + 1 AS flag
 FROM   cte3
        INNER JOIN cte1
             ON  cte1.name = cte3.name
             AND cte1.rid BETWEEN cte3.start_range AND cte3.end_range
 ORDER BY
        cte1.name DESC,
        cte1.visit_time
吉普赛的歌 2018-12-06
  • 打赏
  • 举报
回复
你的是 mysql , 我用的是 sqlserver 而已。 如果你有 sqlserver 环境, 直接运行就能得到结果。 mysql 按这个思路做也能得到结果, 但会麻烦一些。 你的 mysql 版本是多少?
吉普赛的歌 2018-12-06
  • 打赏
  • 举报
回复
引用 3 楼 qq_39408914 的回复:
引用 1 楼 早起晚睡 的回复:
版主威武!!!!
威武个毛线,给我解决问题啊大神
上面不是出来了么, 你还要啥?
木头亻 2018-12-06
  • 打赏
  • 举报
回复
引用 1 楼 吉普赛的歌 的回复:
USE tempdb
GO
IF OBJECT_ID('t') IS NOT NULL DROP TABLE t
GO
CREATE TABLE t(
id INT IDENTITY(1,1) PRIMARY KEY,
[name] NVARCHAR(10) NOT NULL DEFAULT('张三'),
visit_time DATETIME
)
GO
INSERT INTO t(name,visit_time) VALUES ('张三','2018-12-01 08:00:00')
INSERT INTO t(name,visit_time) VALUES ('张三','2018-12-02 08:00:00')
INSERT INTO t(name,visit_time) VALUES ('张三','2018-12-04 08:00:00')
INSERT INTO t(name,visit_time) VALUES ('张三','2018-12-05 08:00:00')
INSERT INTO t(name,visit_time) VALUES ('张三','2018-12-06 08:00:00')
--
INSERT INTO t(name,visit_time) VALUES ('李四','2018-12-01 08:00:00')
INSERT INTO t(name,visit_time) VALUES ('李四','2018-12-03 08:00:00')
INSERT INTO t(name,visit_time) VALUES ('李四','2018-12-04 08:00:00')
INSERT INTO t(name,visit_time) VALUES ('李四','2018-12-05 08:00:00')
INSERT INTO t(name,visit_time) VALUES ('李四','2018-12-06 08:00:00')

;WITH cte1 AS(
SELECT *,
DATEDIFF(DAY, (SELECT MIN(visit_time) FROM t), visit_time) AS rid
FROM t
),cte2 AS(
SELECT NAME,
rid,
rid -ROW_NUMBER()OVER(PARTITION BY [name] ORDER BY rid) AS diff
FROM cte1
)
,cte3 AS (
SELECT NAME,
MIN(rid) AS start_range,
MAX(rid) AS end_range
FROM cte2
GROUP BY
diff,
NAME
)

SELECT
cte1.id
,cte1.[name]
,cte1.[visit_time]
,cte1.rid -start_range + 1 AS flag
FROM cte3
INNER JOIN cte1
ON cte1.name = cte3.name
AND cte1.rid BETWEEN cte3.start_range AND cte3.end_range
ORDER BY
cte1.name DESC,
cte1.visit_time


这是存储过程吗,没看懂
木头亻 2018-12-06
  • 打赏
  • 举报
回复
引用 1 楼 早起晚睡 的回复:
版主威武!!!!
威武个毛线,给我解决问题啊大神
早起晚睡 2018-12-06
  • 打赏
  • 举报
回复
版主威武!!!!

22,300

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧