关键词:
【中文标题】MySQL计算当前连续日期的连续日期【英文标题】:MySQL count consecutive dates for current streak 【发布时间】:2014-08-12 19:03:29 【问题描述】:给定一个包含 timestamp
和 user
列的 MySQL 表,我希望能够计算给定用户连续存在多少天(必须以今天结束)记录。
***/google 上的所有示例都涉及查找以前的条纹或计算总条纹,但我需要了解他们的当前条纹;
我可以使用它来查找有前一天记录的所有日期:
select date(start_of_votes.date_created)
from votes start_of_votes
left join votes previous_day
on start_of_votes.username = previous_day.username
and date(start_of_votes.date_created) - interval 1 day = date(previous_day.date_created)
where previous_day.id is not null
and start_of_votes.username = "bob"
group by date(start_of_votes.date_created) desc
但我只需要计算包含今天记录的范围。
根据请求,一些示例数据:
bob 2014-08-10 00:35:22
sue 2014-08-10 00:35:22
bob 2014-08-11 00:35:22
mike 2014-08-11 00:35:22
bob 2014-08-12 00:35:22
mike 2014-08-12 00:35:22
今天是 2014 年 8 月 12 日:
bob
连续 3 天
sue
没有当前的连续性
mike
连续 2 天
此数据是针对每个用户的,因此我将对bob
运行查询并得到3
作为结果。我不需要按用户细分的结果。
【问题讨论】:
您不能只使用用户变量 + 1 保持运行总计,然后将结果限制在当天给您“连续天数”吗? 能补充一些相关数据吗? 添加了一些示例数据 @xQbert 如果我可以“只是”做某事,我就不会问了。如果我错过了一些对我来说应该很明显的超级基础知识,那这不是第一次。 我的尝试是提供一个方向而不是精确的语法。对我来说,问题是缺少逻辑和功能知识,而不是语法错误,因此为什么我提供了方向而不是具体的解决方案....但是既然您似乎想要更多...请参阅下面的回复。 【参考方案1】:查询将连续计数保存在一个变量中,一旦出现间隙,它就会将计数重置为一个较大的负数。然后它返回最大的连续。
根据用户可以拥有的投票数,您可能需要将-99999
更改为更大的(负)值。
select if(max(maxcount) < 0, 0, max(maxcount)) streak
from (
select
if(datediff(@prevDate, datecreated) = 1, @count := @count + 1, @count := -99999) maxcount,
@prevDate := datecreated
from votes v cross join
(select @prevDate := date(curdate() + INTERVAL 1 day), @count := 0) t1
where username = 'bob'
and datecreated <= curdate()
order by datecreated desc
) t1;
http://sqlfiddle.com/#!2/37129/6
更新
另一种变化
select * from (
select datecreated,
@streak := @streak+1 streak,
datediff(curdate(),datecreated) diff
from votes
cross join (select @streak := -1) t1
where username = 'bob'
and datecreated <= curdate()
order by datecreated desc
) t1 where streak = diff
order by streak desc limit 1
http://sqlfiddle.com/#!2/c6dd5b/20
请注意,fiddle 只有在本文发布之日运行时才会返回正确的条纹 :)
更新 2
下面的查询适用于允许同一用户每天进行多次投票的表格,方法是从删除重复日期的派生表格中进行选择。
select * from (
select date_created,
@streak := @streak+1 streak,
datediff(curdate(),date_created) diff
from (
select distinct date(date_created) date_created
from votes where username = 'pinkpopcold'
) t1
cross join (select @streak := -1) t2
order by date_created desc
)
t1 where streak = diff
order by streak desc limit 1
http://sqlfiddle.com/#!2/5fc6d/7
您可能希望将select *
替换为select streak + 1
,具体取决于您是否要将第一个投票包括在连续投票中。
【讨论】:
我无法让其中任何一个工作。例如,我有一个用户“dolly”,他今天和两天前投票,但昨天没有投票。它显示“连续 2,差异 2”,并且过去四天投票的用户,它显示没有连续。 @helion3 我用相同的场景创建了一个小提琴,它对我有用。也许您的数据库的 curdate() 不是您所期望的? sqlfiddle.com/#!2/d8716/1 这是一个示例用户:sqlfiddle.com/#!2/5fc6d/1/0。运行这个查询我得到:2014-08-17 08:18:03 - 1 - 1
。服务器的curdate()
当前为2014-08-18
。
@helion3,我曾假设每个用户每天只能投 1 票。查看更新
@FuzzyTree 嘿伙计。我真的很喜欢您使用select streak + 1
进行的第二次更新。就我而言,我尝试计算 curdate() 发生了多少票但我失败了:(我尝试在不同的地方添加 COUNT 但这个查询对我来说太复杂了。有什么建议吗?【参考方案2】:
这是它的基本要点:
使用您开始使用的查询创建按日期排序的集合,然后用运行总计包装它以获取计数,但将结果限制在今天。我从内部查询中删除了用户名,以便在需要时可以将其应用于外部查询,或者返回今天匹配的一整套每个人。请注意,除非调整样本数据,否则此小提琴仅在 2014 年 8 月 12 日返回结果。
http://sqlfiddle.com/#!2/a8554/21/0
使用:
Create table votes (
id int,
date_created date,
username varchar(10));
insert into votes (id, username,date_created) VALUES
(1, 'bob', '2014-08-10 00:35:22'),
(2, 'sue', '2014-08-10 00:35:22'),
(3, 'bob', '2014-08-11 00:35:22'),
(4, 'mike', '2014-08-11 00:35:22'),
(5, 'bob', '2014-08-12 00:35:22'),
(6, 'mike', '2014-08-12 00:35:22');
然后
SET @runtot:=0;
select SOVUN, SOVDC,
case when SOVUN = PDUN
then @runtot:=@runtot+1
else @runtot:=0 end as RunningTotal
FROM (
SELECT
start_of_Votes.username SOVUN,
Start_of_Votes.Date_Created SOVDC,
previous_day.username PDUN,
Previous_day.date_created PDDC
from votes start_of_votes
left join votes previous_day
on start_of_votes.username = previous_day.username
and date(start_of_votes.date_created) - interval 1 day = date(previous_day.date_created)
order by SOVUN, SOVDC) B
返回:
SOVUN SOVDC RUNNINGTOTAL
bob August, 10 2014 00:00:00+0000 0
bob August, 11 2014 00:00:00+0000 1
bob August, 12 2014 00:00:00+0000 2
mike August, 11 2014 00:00:00+0000 0
mike August, 12 2014 00:00:00+0000 1
sue August, 10 2014 00:00:00+0000 0
请注意,如果不将其包装在子查询中,则不能按天限制,否则运行总数将不起作用。您不能更早地应用运行总计数,因为必须首先订购该集合。因此需要两个嵌套的子查询。
【讨论】:
我没有看到查询将结果限制为包括今天在内的条纹?通过我对真实数据的测试,它显示了每个用户的每条投票记录以及运行总数(就像你的前任一样,这很好,我可以自己统计它们),但计数真的很混乱。我想这是我的错,我忘了提到一个用户一天最多可能有六票。该查询根据当天的投票数计算每张选票,因此如果某人每天有 6 张选票,则将全部计算 6 次,每次 6 次。在为期一周的连续运行结束时,一位用户的总运行次数为 132。计算连续日期,不包括 SQL 中的周末
】计算连续日期,不包括SQL中的周末【英文标题】:Countingconsecutivedates,excludingweekendsinSQL【发布时间】:2020-03-0515:42:52【问题描述】:我正在编写一份缺勤报告,其中需要包含连续缺勤6次的员工,同时计算给定日期范围内连续缺... 查看详情
计算 Hive 数组中连续日期之间的差异
】计算Hive数组中连续日期之间的差异【英文标题】:CalculatedifferencesbetweenconsecutivedatesinHivearrays【发布时间】:2017-12-1904:18:35【问题描述】:我正在使用Hive,并且需要计算存储在包含在表的每一行中的数组中的连续日期之间的差... 查看详情
使用 Hive 中的值计算连续的日期范围
】使用Hive中的值计算连续的日期范围【英文标题】:CalculatingconsecutiverangeofdateswithavalueinHive【发布时间】:2018-04-1820:47:04【问题描述】:我想知道是否可以计算一组Id的特定值的连续范围并返回每个Id的计算值。给定以下数据:+-... 查看详情
计算两个连续日期之间的唯一 ID,它们是 PySpark 中列的值
】计算两个连续日期之间的唯一ID,它们是PySpark中列的值【英文标题】:CountuniqueidsbetweentwoconsecutivedatesthatarevaluesofacolumninPySpark【发布时间】:2021-12-0910:03:12【问题描述】:我有一个PySparkDF,带有ID和日期列,如下所示。IDDate12021... 查看详情
mysql如何查询两个日期之间最大的连续登录
参考技术A你的日期字段存储类型是datetime吗,那就直接可以比较大小比如去2014-10-28(时分秒省略)这一天的时间段`date_time`>'2014-10-2723:59:59'and`date_time`<'2014-10-29'或者使用between时间1and时间2也行 查看详情
加入一系列日期并计算连续天数
】加入一系列日期并计算连续天数【英文标题】:Joiningseriesofdatesandcountingcontinousdays【发布时间】:2015-08-1814:18:29【问题描述】:假设我有一张如下表dateadd_days2015-01-0152015-01-0422015-01-1172015-01-20102015-01-301我想要做的是检查days_balanc... 查看详情
sql连续活跃天数(代码片段)
1.背景已知数据集为:目的:计算每个uid的连续活跃天数,并且每一段活跃期内的开始时间和结束时间2.步骤第一步:处理数据集处理数据集,使其满足每个uid每个日期只有一条数据。第二步:以uid为主键,按照日期进行排序,... 查看详情
您如何计算 Microsoft Access SQL 查询中的连续日期?
】您如何计算MicrosoftAccessSQL查询中的连续日期?【英文标题】:HowDoYouCountContiguousDatesinMicrosoftAccessSQLQuery?【发布时间】:2015-04-3013:50:03【问题描述】:我正在处理一个需要这个的查询,但对于这个论坛的问题,我将使用一个假设... 查看详情
选择查询以连续查找最大日期
..._12想知道哪个有最大日期和时间。必须知道是否存在距离当前时间不到10分钟的日期。可以在上面的sql查询中提供帮助【问题讨论】:【 查看详情
hutool日期工具类相关:获取某月所有周某周的起止时间或所有日期计算连续天数(代码片段)
...间3、获取当前月某一周的所有日期4、多个日期中,计算最大的连续天数5、判断指定日期是否在某个范围内前言最近做项目,碰到一个比较复杂的日期查询方式,在这里记录一下,方便以后忘了随时能查到。像我... 查看详情
mysql计算2个日期的月份差和天数差(代码片段)
目录 一、计算两个日期的相隔月份 二、计算2个日期的相隔天数 一、计算两个日期的相隔月份 格式: PERIOD_DIFF(startDate,endDate)返回结果为月份数,格式必须是连续的数字,否则计算的结果可能会出错。SELECTPERIOD_DIFF(201... 查看详情
mysql计算2个日期的月份差和天数差(代码片段)
目录 一、计算两个日期的相隔月份 二、计算2个日期的相隔天数 一、计算两个日期的相隔月份 格式: PERIOD_DIFF(startDate,endDate)返回结果为月份数,格式必须是连续的数字,否则计算的结果可能会出错。SELECTPERIOD_DIFF(201... 查看详情
PHP / MYSQL - 计算有多少连续的前一周结果与当前一周具有相同的价值(音乐图表)
】PHP/MYSQL-计算有多少连续的前一周结果与当前一周具有相同的价值(音乐图表)【英文标题】:PHP/MYSQL-CountingHowManyConsecutivePreviousWeeksResultsHaveSameValueAsCurrentWeek(MusicCharts)【发布时间】:2021-11-3010:32:42【问题描述】:我正在苦苦尝... 查看详情
从连续日期中查找最近的开始日期和结束日期
】从连续日期中查找最近的开始日期和结束日期【英文标题】:Findingmostrecentstartdate,andendDatefromconsecutivedates【发布时间】:2021-11-0616:00:33【问题描述】:我有一张如下表:user_idstore_idstockdate116202021-10-18116202021-10-19116202021-10-20116202... 查看详情
返回连续日期的临时表
】返回连续日期的临时表【英文标题】:Returntemptableofcontinuousdates【发布时间】:2009-09-0817:54:39【问题描述】:我需要创建一个返回连续日期表的函数。我会传入一个最小和最大日期。我希望它可以这样调用:SELECT*FROMGetDates(\'01/... 查看详情
使用 SQL 检测连续的日期范围
】使用SQL检测连续的日期范围【英文标题】:DetectconsecutivedatesrangesusingSQL【发布时间】:2013-12-0514:05:39【问题描述】:我想填写需要开始和结束日期信息的日历对象。我有一列包含一系列日期。有些日期是连续的(相差一天),... 查看详情
按名称分组的连续日期范围内的最小和最大日期
】按名称分组的连续日期范围内的最小和最大日期【英文标题】:Minimumandmaximumdateswithincontinuousdaterangegroupedbyname【发布时间】:2020-05-0622:27:08【问题描述】:我有一个人的开始和结束日期的数据范围,我想只获得每个人的连续日... 查看详情
hive计算最大连续登陆天数
...了一套股票算法,其中有一点涉及到股票连续涨停天数的计算方法,我们都知道股票周末是不开市的,这里有个断层,需要一点技巧。我问是不是时间序列,他说我瞎扯,我也知道自己是瞎扯。问他方法,他竟然不告诉我,这么... 查看详情